【问题标题】:ioctl with FIONREAD return value具有 FIONREAD 返回值的 ioctl
【发布时间】:2013-09-24 19:39:15
【问题描述】:

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

【问题讨论】:

    标签: c++ sockets berkeley-sockets


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 2012-11-01
      • 1970-01-01
      • 2014-05-15
      • 1970-01-01
      • 2017-01-06
      • 2021-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多