2

这个问题与udp socket 的 FIONREAD 返回什么有关?

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

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

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

在每次通话numBytesRecv != 0时,numBytesRecv == totalPending - 16

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

4

1 回答 1

4

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

于 2013-09-24T19:58:39.400 回答