Linux |
CentOS 4.8 |
|
udp(7) |
udp − Protocole UDP pour IPv4 |
#include <sys/socket.h> |
Il s’agit d’une implémentation de l’User Datagram Protocol décrit dans la RFC 768. Elle implémente un service de paquets datagrammes non-fiables, sans connexion. Les paquets peuvent être réordonnées ou dupliqués avant leur arrivée. UDP créé et vérifie des sommes de contrôle pour détecter les erreurs de transmission. Lorsqu’une socket UDP est créée, ses adresses locales et distantes sont indéterminées. Les datagrammes peuvent être envoyés immédiatement en utilisant sendto(2) ou sendmsg(2) avec une adresse de destination valide en argument. Lorsque connect(2) est appelé sur une socket, l’adresse de destination par défaut est fixée, et les datagrammes pourront être envoyés avec send(2) ou write(2) sans spécifier d’adresse de destination. Il restera possible d’envoyer des données à d’autres destinations en passant l’adresse à sendto(2) ou sendmsg(2). Afin de recevoir les paquets, une socket doit être attachée à une adresse locale en utilisant bind(2). Sinon la couche socket affectera automatiquement une port local libre, hors de l’intervalle défini par net.ipv4.ip_local_port_range et attacher la socket à l’adresse INADDR_ANY. Les opérations de réception ne renvoie qu’un seul paquet à la fois. Si le paquet est plus petit que le buffer transmis, il n’y aura pas plus de données renvoyées. S’il est plus grand le paquet sera tronqué et le drapeau MSG_TRUNC sera activé. MSG_WAITALL n’est pas supporté. Les options IP peuvent être fixées ou lues en utilisant les options des sockets décrites dans ip(7). Elles ne sont traitées par le noyau que lorsque le sysctl approprié est activé (mais sont quand même fournies à l’utilisateur quant il est inhibé). Voir ip(7). Quand l’attribut MSG_DONTROUTE est actif à l’émission, l’adresse de destination doit représenter une adresse d’interface locale, et le paquet n’est envoyé qu’à cette interface. UDP fragmente un paquet quand sa longueur totale excède le MTU de l’interface (Maximum Transmission Unit). Une alternative plus efficace pour le réseau est d’utiliser la recherche du MTU du chemin, comme indiqué dans la section IP_PMTU_DISCOVER de ip(7). |
UDP utilise le format d’adresse IPv4 sockaddr_in comme indiqué dans ip(7). |
Toutes les erreurs fatales seront transmises à l’utilisateur comme un retour d’erreur même lorsque la socket n’est pas connectée. Ceci inclut les erreurs asynchrones reçues du réseau. Vous pouvez ainsi recevoir une erreur due à un paquet précédemment envoyé sur la même socket. Ce comportement diffère de celui de nombreuses autres implémentations des sockets BSD, qui ne transmettent pas d’erreur si la socket n’est pas connecté. Les comportement de Linux correspond à la RFC 1122. Pour assurer la compatibilité avec du code ancien, on peut fixer l’option SOL_SOCKET SO_BSDCOMPAT pour ne recevoir les erreurs distantes que si la socket a été connectée (sauf pour EPROTO et EMSGSIZE). Il vaut mieux corriger le code pour gérer les erreurs proprement plutôt que d’activer cette option. Les erreurs locales sont toujours transmises. Lorsque l’option IP_RECVERR est active, toutes les erreurs sont stockées dans la file d’erreur de la socket et peuvent être lues avec recvmsg(2) en activant son option MSG_ERRQUEUE. |
Les ioctls sont accessible avec l’appel-système ioctl(2). La syntaxe correcte est : |
int value; error = ioctl(tcp_socket, ioctl_type, &value); |
SIOCINQ |
Prend en argument un pointeur sur un entier. Y écrit la taille en octets du prochain datagramme en attente, ou 0 si aucun datagramme n’est disponible. |
SIOCOUTQ |
Renvoie le nombre d’octets de données dans la file d’émission locale. Seulement sur Linux 2.4 et ultérieurs. |
De plus, les ioctls documenté dans ip(7) et socket(7) sont supportés. |
Toutes les erreurs documentées pour socket(7) ou ip(7) peuvent être renvoyées lors d’une émission ou d’une réception sur une socket UDP. ECONNREFUSED Aucun correspondant sur l’adresse destination associée à la socket. Ceci peut être causé par l’émission antérieure d’un paquet sur la socket. |
IP_RECVERR est une nouveauté de Linux 2.2. |
Cette page de manuel a été écrite par Andi Kleen. |
ip(7), socket(7), raw(7). RFC 768 pour le protocole UDP |
Christophe Blaess, 2001. |
udp(7) |