UDP(数据报)套接字的FIONREAD返回什么?

时间:2013-06-08 03:36:44

标签: networking udp datagram ioctl

ioctl的{​​{1}}返回哪一个,下一个数据包的长度,或缓冲区中所有数据的长度?

假设有一个FIONREAD服务器在客户端1的数据包之后接收来自客户端1的2个数据包和来自客户端2的另外2个数据包。 然后,UDP的{​​{1}}的值是多少, 在这种情况下ioctl会返回什么?

客户端1:v两个数据包

++ UDP服务器有4个数据包< - FIONREAD?

客户端2:^两个数据包

FIONREAD? (服务器)

  1. 客户端1的第一个数据包的长度
  2. 客户端1的两个数据包的长度
  3. 客户端1的两个数据包的长度+客户端2的两个数据包
  4. 客户端1的第一个数据包+客户端2的第一个数据包的长度
  5. 其他

2 个答案:

答案 0 :(得分:4)

man udp (7)州:

   FIONREAD (SIOCINQ)
          Gets a pointer to an integer as argument.  Returns the  size  of
          the  next pending datagram in the integer in bytes, or 0 when no
          datagram is pending.  Warning: Using FIONREAD, it is  impossible
          to  distinguish  the  case where no datagram is pending from the
          case where the next pending  datagram  contains  zero  bytes  of
          data.   It  is  safer  to use select(2), poll(2), or epoll(7) to
          distinguish these cases.

因此,您的问题的答案是: FIONREAD返回下一个(第一个)待处理数据报的大小

答案 1 :(得分:2)

它与平台有关。

  • 在某些平台上,UDP套接字上的FIONREAD返回第一个数据报的大小。
  • 在其他情况下,它返回可以无阻塞地读取的总字节数,这是当前在套接字接收缓冲区中的总字节数。

有关详细信息,请参阅here

recvfrom()的返回值是实际传输的字节数。