问题
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
回答1:
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.
回答2:
It is platform-dependent.
- On some platforms, FIONREAD on a UDP socket returns the size of the first datagram.
- On others it returns the total number of bytes that can be read without blocking, which is the total number of bytes presently in the socket receive buffer.
See here for further information.
The return value of recvfrom()
is the actual number of bytes transferred.
来源:https://stackoverflow.com/questions/16995766/what-does-fionread-of-udp-datagram-sockets-return