这个问题与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 == totalPending - 16假定numBytesRecv != 0吗?

最佳答案

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

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

10-09 13:23