unix sockets networking udp ioctl

unix - La duración máxima del buffer para sendto?



sockets networking (3)

Como UDP no está orientado a la conexión, no hay forma de indicar que dos paquetes pertenecen juntos. Como resultado, está limitado por el tamaño máximo de un único paquete IP (65535). Los datos que puede enviar son algo menores, porque el tamaño del paquete IP también incluye el encabezado IP (generalmente 20 bytes) y el encabezado UDP (8 bytes).

Tenga en cuenta que este paquete IP se puede fragmentar para que quepa en paquetes más pequeños (por ejemplo, ~ 1500 bytes para ethernet).

No estoy al tanto de ningún SO que lo restrinja más.

¿Cómo se obtiene el número máximo de bytes que se pueden pasar a una llamada a sendto(..) para un socket abierto como un puerto UDP?


En Mac OS X existen diferentes valores para enviar (SO_SNDBUF) y recibir (SO_RCVBUF). Este es el tamaño del buffer de envío (man getsockopt):

getsockopt (calcetín, SOL_SOCKET, SO_SNDBUF, (int *) y optval, y optlen);

Intentar enviar un mensaje más grande (en Leopard 9216 octetos en UDP enviado a través del bucle de retorno local) dará como resultado "Mensaje demasiado largo / EMSGSIZE".


Use getsockopt (). Este sitio tiene un buen desglose del uso y las opciones que puede recuperar.

En Windows, puedes hacer:

int optlen = sizeof(int); int optval; getsockopt(socket, SOL_SOCKET, SO_MAX_MSG_SIZE, (int *)&optval, &optlen);

Para Linux, de acuerdo con la página man de UDP, el kernel usará descubrimiento MTU (verificará cuál es el tamaño máximo de paquete UDP entre aquí y el destino, y lo elegirá), o si el descubrimiento MTU está desactivado, configurará el tamaño máximo para la interfaz MTU y fragmentar algo más grande. Si está enviando a través de Ethernet, la MTU típica es de 1500 bytes.