Search code examples
network-programmingudpdatagramioctl

What does FIONREAD of UDP (datagram) sockets return?


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)

  1. length of client 1's first packet
  2. length of client 1's two packets
  3. length of client 1's two packets + client 2's two packets
  4. length of client 1's first packet + client 2's first packet
  5. other

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.