2008-08-25 26 views

Respuesta

1

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 de IP se puede fragmentar para que quepa en paquetes más pequeños (por ejemplo, ~ 1500 bytes para ethernet).

No tengo conocimiento de que ningún SO lo restrinja más.

11

Utilice getsockopt(). This site tiene un buen desglose del uso y las opciones que puede recuperar.

En Windows, puede hacerlo:

 
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 del manual UDP, el kernel utilizar el descubrimiento de MTU (se comprobará cuál es el tamaño máximo de paquete UDP es entre aquí y el destino , y elija eso), o si el descubrimiento de MTU está desactivado, establecerá el tamaño máximo para la MTU de la interfaz y fragmentará algo más grande. Si está enviando a través de Ethernet, la MTU típica es de 1500 bytes.

5

En Mac OS X existen diferentes valores para enviar (SO_SNDBUF) y recibir (SO_RCVBUF). Este es el tamaño del búfer de emisión (hombre getsockopt):

getsockopt (calcetín, SOL_SOCKET, SO_SNDBUF, (int *) & optval, & lonopc);

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".