Création de sockets
En langage C :
C'est un moyen de communication, mis en place à l'origine par l'université de Berkeley, entre des applications.
Lors de l'utilisation de la "socket library" en langage C, il convient d'inclure les fichiers header correspondant à cette bibliothèque système et aux constantes utilisées.
#include <sys/types.h>
#include <netdb.h>
#include <sys/socket.h>
La première étape consiste en la création d'une socket (si ce n'était devenu également en français le terme consacré, on le traduirait en "prise" au sens "prise de courant") via l'appel système :
int socket (int domaine, int type, int protocole);
- le premier paramètre est le domaine. C'est un entier qui peut prendre comme valeur l'une des constantes suivantes :
- AF_INET : pour fonctionner avec IPv4 comme couche réseau.
- AF_INET6 : pour fonctionner avec IPv6 comme couche réseau.
- AF_PACKET : pour fonctionner directement au dessus de la couche liaison (couche 2) sans utiliser l'implémentation d'une couche réseaux (couche 3) du kernel.
- AF_UNIX : pour fonctionner avec des sockets unix et avoir une communication limitée aux processus résidant sur la même machine.
Dans certains cas, cette constante est remplacée par le synonyme AF_LOCAL, qui appartient d’ailleurs à la terminologie Posix.
- Le second paramètre est le type. C'est un entier qui peut prendre comme valeur l'une des constantes suivantes :
- SOCK_STREAM : le dialogue s’effectue en mode connecté, avec un contrôle de flux d’une extrémité à l’autre de la communication.
- SOCK_DGRAM : la communication a lieu sans connexion, par transmission de paquets de données (c'est à dire par échange de "datagramme").
- SOCK_RAW : la socket sera utilisée pour dialoguer de manière brute avec le protocole indiqué. C'est ce qu'il faut utiliser avec la valeur de domaine AF_PACKET.
- Le troisième paramètre est le protocole de transport utilisé. C'est un entier qui peut prendre comme valeur l'une des constantes suivantes :
- NULL : si on choisit le protocole par défaut pour le type de communication indiqué.
- IPPROTO_TCP : on indique le protocole TCP. C'est la valeur par défaut si le type vaut SOCK_STREAM.
- IPPROTO_UDP : on indique le protocole UDP. C'est la valeur par défaut si le type vaut SOCK_DGRAM.
- IPPROTO_ICMP : on indique le protocole ICMP. C'est l'une des deux valeurs à choisir quand le domaine est AF_INET (ou AF_INET6) et le type est SOCK_RAW.
- IPPROTO_RAW : on indique une communication directe avec la couche réseau du domaine indiqué. C'est l'une des deux valeurs à choisir quand le domaine est AF_INET (ou AF_INET6) et le type est SOCK_RAW.
- Dans le cas du domaine AF_PACKET, on indiquera la valeur du champ protocole dans la trame Ethernet. Si on souhaite recevoir tous les types de trame, on utilisera htons(ETH_P_ALL).
- La valeur retournée est un entier positif ou nul correspondant au numéro du descripteur alloué par la socket que l'on vient de créer ou une valeur négative pour indiquer une erreur :
- EMFILE : constante correspondant à une table des fichiers pleine dans le kernel.
- ENFILE : constante correspondant au fait que la limite du nombre total de fichiers ouverts sur le système a été atteinte.
- ENOMEM : constante correspondant au fait qu'il n'y a pas suffisamment d'espace pour allouer les tampons nécessaires. La socket ne peut être créée tant que suffisamment de ressources ne seront pas libérées.
- EINVAL : constante correspondant à un domaine inexistant.
- EPROTONOSUPPORT : constante correspondant à un type incohérent avec le protocole ou le domaine
- EACCES : constante correspondant à l'absence d’autorisation de créer une socket du type demandé (par exemple AF_INET et SOCK_RAW).
Remarques :
- Dans ce cours, on utilisera uniquement des sockets internet TCP ou UDP qui sont donc créées via l'une des deux instructions suivantes :
fd_tcp = socket (AF_INET, SOCK_STREAM, IPPROTO_TCP);
fd_udp = socket (AF_INET, SOCK_DGRAM, IPPROTO_UDP);
- On a seulement réservé dans le kernel la mémoire de gestion de la socket, aucune communication n'a encore été amorcée.
- Il existe une bibliothèque équivalente à la "socket library" pour Windows : La "Winsock library" qui fonctionne globalement sur le même principe.
- Dans les langages comme PHP ou Python, il existe des bibliothèques faisant l'interface avec les fonctions systèmes.
$socket_tcp = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$socket_udp = socket_create(AF_INET, SOCK_DGRAM, SOL_UDP);
sock_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock_udp = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)