NOMBRE¶
udp - Protocolo UDP sobre IPv4.
SINOPSIS¶
#include <sys/socket.h>
#include <netinet/in.h>
udp_socket = socket(PF_INET, SOCK_DGRAM, 0);
DESCRIPCIÓN¶
Ésta es una implementación del protocolo UDP (User Datagram Protocol)
descrito en RFC768. Implementa un servicio de paquetes de datagramas no fiable
y sin conexión. Los paquetes pueden ser reordenados o duplicados antes de
que lleguen. UDP genera y comprueba sumas de verificación (checksums)
para detectar errores de transmisión.
Cuando se crea un conector (socket) UDP, sus direcciones local y remota
están sin especificar. Se pueden enviar datagramas inmediatamente usando
sendto(2) o
sendmsg(2) con una dirección de destino
válida como argumento. Cuando se llama a
connect(2) sobre el
conector, se envía la dirección de destino por defecto y a partir de
ese momento se pueden enviar datagramas usando
send(2) o
write(2) sin especificar una dirección de destino. Todavía es
posible realizar envíos a otros destinos pasando una dirección a
sendto(2) o
sendmsg(2). Para poder recibir paquetes, se debe
ligar primero el conector a una dirección local usando
bind(2). De
otra manera la capa de conector asignará automáticamente un puerto
local libre fuera del rango definido por
net.ipv4.ip_local_port_range y
ligará el conector a
INADDR_ANY.
Todas las operaciones de recepción sólo devuelven un paquete. Cuando
el paquete es más pequeño que el buffer pasado, sólo se
devuelven los datos del paquete y, cuando es mayor, el paquete se trunca y la
bandera
MSG_TRUNC se activa.
MSG_WAITALL no está soportada.
Se pueden enviar o recibir opciones IP usando las opciones de conectores
descritas en
ip(7). Estas son procesadas por el núcleo sólo
cuando está activa la sysctl adecuada (pero todavía se pasan al
usuario incluso cuando está desactivada). Vea
ip(7).
Cuando en un envío está activa la opción
MSG_DONTROUTE, la
dirección de destino debe referirse a la dirección de una interfaz
local y el paquete sólo se envía a esa interfaz.
UDP fragmenta un paquete cuando su longitud total excede la MTU (Unidad de
Transmisión Máxima) de la interfaz. Una alternativa de red más
amigable es usar el descubrimiento de la MTU de la ruta como se describe en la
sección
IP_PMTU_DISCOVER de
ip(7).
UDP usa el formato de dirección
sockaddr_in de IPv4 descrito en
ip(7).
MANEJO DE ERRORES¶
Todos los errores fatales serán pasados al usuario como un resultado de
error incluso cuando el conector no esté conectado. Ésto incluye
errores asíncronos recibidos de la red. Puede obtenerse un error por un
paquete anterior que fue enviado por el mismo conector. Este comportamiento
difiere de muchas otras implementaciones de conectores BSD que no pasan
ningún error al menos que el conector esté conectado. El
comportamiento de Linux viene mandado por el
RFC1122.
Por compatibilidad con código anterior es posible activar la opción
SO_BSDCOMPAT de SOL_SOCKET para recibir errores remotos (excepto
EPROTO y
EMSGSIZE) sólo cuando el conector se ha conectado.
Es mejor arreglar el código para manejar adecuadamente los errores que
habilitar esta opción. Los errores generados localmente siempre se pasan.
Cuando se activa la opción
IP_RECVERR todos los errores se almacenan
en la cola de errores de conector y se pueden recibir mediante
recvmsg(2) con la opción
MSG_ERRQUEUE activa.
IOCTLS¶
Estos ioctls pueden ser utilizados con
ioctl(2). La sintaxis correcta es:
int value;
error = ioctl(tcp_socket, ioctl_type, &value);
- SIOCINQ
- Recibe un puntero a un entero como argumento. Devuelve el
tamaño del siguiente datagrama pendiente en el entero en bytes,
ó 0 cuando no quedan datagramas pendientes.
- SIOCOUTQ
- Devuelve el número de bytes de datos en la cola de
envío local. Sólo disponible en Linux 2.4 o superior.
Además todos los ioctls documentados en
ip(7) y
socket(7)
están soportados.
ERRORES¶
Una operación de enviar o recibir sobre un conector UDP puede devolver
cualquier error documentado en
socket(7) o
ip(7).
ECONNREFUSED No se ha asociado un receptor a la dirección de
destino. Esto podría ser provocado por un paquete anterior enviado por el
conector.
VERSIONES¶
IP_RECVERR es una nueva característica de la versión 2.2 de Linux.
CREDITOS¶
Esta página de manual fue escrita por Andi Kleen.
VÉASE TAMBIÉN¶
ip(7),
socket(7),
raw(7)
RFC768 para el protocolo UDP.
RFC1122 para los requisitos del anfitrión (host).
RFC1191 para una descripción del descubrimiento de la MTU de la ruta.