带有FIONREAD的ioctl返回值

时间:2013-09-24 19:39:16

标签: c++ sockets berkeley-sockets

此问题与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 != 0numBytesRecv == totalPending - 16

的每次通话中

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

1 个答案:

答案 0 :(得分:4)

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