6

哪个返回,ioctlFIONREAD一个数据包的长度,或缓冲区中所有数据的长度?

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

客户端 1:v 两个数据包

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

客户端 2 : ^ 两个数据包

FIONREAD?(服务器)

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

2 回答 2

5

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 返回下一个(第一个)待处理数据报的大小

于 2013-08-21T06:17:00.313 回答
2

它依赖于平台。

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

请参阅此处了解更多信息。

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

于 2013-06-08T08:17:31.793 回答