¿Cuál es la longitud máxima permitida por la función sendto en C?

Estoy implementando una stack de red simple utilizando sockets UDP y deseo enviar aproximadamente 1 MB de datos de cadena desde el cliente al servidor. Sin embargo, no sé si hay un límite en el tamaño de la longitud en la API UDP de to to sendto() en C. Si hay un límite y sendto() no manejará la paquetización más allá de un límite, entonces tendría que hacerlo manualmente. dividir la cadena en bloques más pequeños y luego enviarlos.

¿Hay un límite en la longitud del búfer? O la API sendto() maneja la paquetización por sí misma.

Cualquier apreciación es apreciada.

No hay límite de API en el sendto : puede manejar cualquier tamaño que pueda el protocolo subyacente.

HAY un límite de paquetes para UDP – 64K; si supera esto, la llamada de sendto a enviará un error con un código de error EMSGSIZE . También hay límites de tamaño de paquetes para IP que difieren entre IPv4 e IPv6. Finalmente, el transporte de bajo nivel tiene un tamaño de MTU que puede o no ser un problema. Los paquetes IP se pueden dividir en varios paquetes de nivel inferior y se pueden volver a ensamblar automáticamente, a menos que haya utilizado una llamada IP_OPTIONS setsockopt para deshabilitar la fragmentación.

La forma más fácil de lidiar con toda esta complejidad es hacer que su código sea flexible: detecte los errores EMSGSIZE de sendto y use mensajes más pequeños si lo recibe. También funciona bien si desea realizar el descubrimiento de MTU de ruta, que generalmente aceptará mensajes más grandes al principio, pero reducirá el tamaño máximo de mensaje cuando envía uno que termina excediendo la MTU de ruta.

Si solo quiere evitar preocuparse por ello, es probable que un envío de 1452 bytes o menos siempre sea correcto (es decir, la carga de Ethernet normal de 1500 bytes máximo menos 40 para un encabezado IPv6 normal y 8 para un encabezado UDP), a menos que re utilizando una VPN (en cuyo caso debe preocuparse por la sobrecarga de encapsulación).