具有 FIONREAD 返回值的 ioctl

Mir*_*pas 2 c++ sockets berkeley-sockets

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

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

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

numBytesRecv = recvfrom(socketId, buffer, maxLen, 0, socketAddress, &socketAddressLen);
Run Code Online (Sandbox Code Playgroud)

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

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

Rem*_*eau 5

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