gpt4 book ai didi

c++ - 带有 FIONREAD 返回值的 ioctl

转载 作者:搜寻专家 更新时间:2023-10-31 01:07:43 24 4
gpt4 key购买 nike

这个问题与What does FIONREAD of udp socket return?有关

我尝试在 Mac 上使用下一个代码:

if( ioctl(socketId, FIONREAD, &totalPending) == -1 )
{
printf("%d", totalPending);
}

numBytesRecv = recvfrom(socketId, buffer, maxLen, 0, socketAddress, &socketAddressLen);

每次调用 numBytesRecv != 0 时,numBytesRecv == totalPending - 16

你能解释一下为什么会这样吗?这个返回值正确吗?如果是,我可以为每个值 numBytesRecv != 0 假设 numBytesRecv == totalPending - 16 吗?

最佳答案

根据this question的回答, Mac 上的 FIONREAD 返回套接字接收缓冲区中所有可用数据的大小,而不是下一个待处理消息的大小。 recvfrom() 报告接收到的消息的负载大小。因此,您可能看到的只是 FIONREAD 报告套接字接收缓冲区中与下一个待处理消息之后的消息相关的额外字节。如果您需要知道下一条待处理消息的大小,请使用 FIONREAD 来了解何时调用recvfrom(),但不要依赖在 FIONREAD 上告诉您实际消息大小。相反,调用带有 MSG_PEEK 标志和大数据缓冲区的 recvfrom()。返回值将告诉您消息大小。然后,您可以在没有 MSG_PEEK 标志的情况下再次调用 recvfrom() 来接收消息并将其从接收缓冲区中删除。

关于c++ - 带有 FIONREAD 返回值的 ioctl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18990555/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com