关于带有FIONREAD返回值的c:ioctl

ioctl with FIONREAD return value

此问题与udp套接字的FIONREAD返回什么有关?

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

1
2
3
4
5
6
if( ioctl(socketId, FIONREAD, &totalPending) == -1 )
{
    printf("%d", totalPending);
}

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

在每个呼叫中??,其中numBytesRecv != 0numBytesRecv == totalPending - 16

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


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