What does FIONREAD of UDP (datagram) sockets return?

datagram, ioctl, networking, udp

Solution

man udp (7) states:

   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.

So, the answer to your question is: FIONREAD returns the size of the next (first) pending datagram.

Problem

Which one does `ioctl` of `FIONREAD` return, the next packet's length, or the length of all data in the buffer? Suppose there is a `UDP` server that receives 2 packets from a client 1 and another 2 packets from client 2 after client 1's packet. Then, what is the value of `ioctl` of `FIONREAD`, and what does `readfrom` return in that case? Client 1 : v two packets ++UDP Server got 4 packets <- FIONREAD? Client 2 : ^ two packets FIONREAD? (server) - length of client 1's first packet - length of client 1's two packets - length of client 1's two packets + client 2's two packets - length of client 1's first packet + client 2's first packet - other

Original source

Related problems