networking - ¿Qué devuelve FIONREAD de la toma udp?
datagram ioctl (2)
¿Cuál regresa de la devolución de FIONREAD
, la longitud del siguiente paquete o la longitud de todos los datos en el búfer?
Supongamos que hay un servidor UDP
que recibe 2 paquetes de un cliente 1 y otros 2 paquetes del cliente 2 después del paquete del cliente 1. Entonces, ¿cuál es el valor de ioctl
de FIONREAD
, y qué dice readfrom
return en ese caso?
Cliente 1: v dos paquetes
++ El servidor UDP tiene 4 paquetes <- FIONREAD?
Cliente 2: ^ dos paquetes
¿FIONREAD? (servidor)
- longitud del primer paquete del cliente 1
- longitud de los dos paquetes del cliente 1
- longitud de los dos paquetes del cliente + los dos paquetes del cliente
- longitud del primer paquete del cliente 1 + primer paquete del cliente 2
- otro
FIONREAD devuelve el número total de bytes que se pueden leer sin bloquear, que es el número total de bytes actualmente en el búfer de recepción de socket.
El valor de rreturn de recvfrom () es el número real de rpbytes transferidos.
hombre udp (7) estados:
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.
Entonces, la respuesta a su pregunta es: FIONREAD devuelve el tamaño del siguiente (primer) datagrama pendiente .