2010-07-20 14 views
10

Entiendo que el tamaño de búfer máximo predeterminado que puedo usar con estas funciones es 65507 (5535 - encabezado IPv4 - encabezado UDP). Sin embargo, ¿hay alguna manera de cambiar esto? Necesito poder enviar un búfer más grande ~ 66000 bytes. Intenté usar la función setsockopt(), pero no pareció funcionar.UDP sendto() y recvfrom() tamaño máximo de búfer

Gracias!

+0

¿No puedes dividir tu memoria intermedia, etiquetándola con bits adicionales para saber la orden? – Scharron

+0

Parece que tendré que idear un esquema como este. –

+1

5535 debe ser 65535 – kumar

Respuesta

12

No.

UDP sólo proporciona un datagrama como la parte de datos de un paquete IP, un paquete IP tiene un campo de longitud de 16 bits que limita los datos a 2^16 bytes, incluyendo las cabeceras, o 65507 bytes para la parte de datos UDP (suponiendo que no haya opciones de ipv4), no hay forma de manejar paquetes más grandes con UDP además de dividirlos en varios paquetes y manejar el reensamblaje, etc. usted mismo.

+0

Gracias por la aclaración. –

6

La especificación UDP le proporciona 16bits en el encabezado UDP para el tamaño del paquete, lo que significa que no puede enviar más de 65k a la vez. No puedes cambiar esto.

Tiene que dividir sus datos en varios paquetes. Usar TCP en lugar de UDP simplificará mucho la tarea, ya que se garantiza la integridad y el orden de recepción.

+1

+1 para sugerir TCP en su lugar. – Matt

8

También es bastante probable que pierda paquetes UDP "grandes" en el camino, porque el paquete IP de envoltura podría estar fragmentado debido a las limitaciones de MTU. Cada uno de los fragmentos puede perderse y no hay un mecanismo de recuperación en UDP. Entonces, mientras que el límite teórico para la carga UDP es de aprox. 64kB el límite práctico es alrededor de 1kB.

+4

Este es un punto importante. Un paquete UDP de 65500 bytes fragmentado en fragmentos de tamaño de ethernet convertirá una tasa de pérdida de fragmento subyacente de 1% en una tasa de pérdida de paquetes UDP de ~ 37%. Grandes paquetes UDP - ¡no lo hagas! – caf

+0

Donde trabajo solucionamos este problema utilizando interfaces dedicadas en una subred privada para el tráfico UDP con los paquetes grandes (y entradas ARP estáticas para evitar las caídas ARP periódicas). Sin embargo, si no puedes hacer eso, prepárate para los paquetes descartados. –

Cuestiones relacionadas