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

6
< p >对于FIONREADioctl,它返回的是缓冲区中数据的总字节数,而不是下一个数据包的长度。

假设有一个UDP服务器,接收到来自两个客户端1的2个数据包,然后再接收到来自客户端2的2个数据包,那么此时FIONREAD的值是多少?在这种情况下readfrom会返回什么?

客户端1: v两个数据包

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

客户端2: ^两个数据包

FIONREAD? (服务器)

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

你好!请查看新答案。 - Kolyunya
2个回答

6

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

那么您是指整个数据包的大小还是仅指数据报数据的大小? - minmaxavg
@jinoh67 我不太确定,因为手册没有明确说明,但我今天会通过实验找出答案。 - Kolyunya
3
@jinoh67 我刚刚检查了一下,在我的Debian 7上,FIONREAD返回的是数据报中包含的数据大小(数据报消息大小)。 - Kolyunya

3

它是依赖于平台的。

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

欲了解更多信息,请参见此处

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


那么你的意思是FIONREAD的正确值为3,而recvfrom的数据包长度为2吗?(当然我使用非阻塞套接字) - minmaxavg
我说的话是真心的,它适用于使用我提供的措辞的UDP和TCP。 - user207421
1
我不确定你对于UDP套接字的回答是否正确。你有关于FIONREAD返回可以无阻塞读取的总字节数的任何参考资料吗?我已经发布了一条带有其他信息参考的回答。 - Kolyunya
@Kolyunya 我们两个都是对的,看编辑。 - user207421

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接