Aller au contenu principal

Sockets et IPC réseau

Progression

#Communications entre processus par sockets

Les sockets offrent une API uniforme pour relier deux processus, que ce soit sur la même machine (sockets Unix) ou à travers un réseau (sockets IP). Un serveur installe un point d'écoute ; un client s'y connecte ; des octets transitent dans les deux sens.

#1. Cycle serveur-client

Côté serveur, la chorégraphie suit toujours la même séquence : socket, bind, listen, puis une boucle accept qui récupère les connexions entrantes. Côté client, un simple connect suffit à établir le canal. Une fois la poignée de main terminée, les deux extrémités disposent d'un flux bidirectionnel que send/recv ou read/write peuvent manipuler. Les tampons noyau stockent temporairement les données ; si le lecteur ne suit pas, l'écrivain est bloqué ou reçoit EWOULDBLOCK en mode non bloquant.

cc
1int server = socket(AF_INET, SOCK_STREAM, 0);2bind(server, (struct sockaddr *)&addr, sizeof addr);3listen(server, SOMAXCONN);4for (;;) {5    int client = accept(server, NULL, NULL);6    handle(client);7    close(client);8}

Ce squelette constitue la base d'innombrables serveurs, du démon SSH au proxy HTTP.

#2. UDP, sockets Unix et multiplexage

UDP (type SOCK_DGRAM) ne crée pas de connexion persistante. Chaque datagramme transporte sa propre adresse source ; l'application doit gérer les pertes éventuelles. À l'opposé, les sockets Unix (AF_UNIX) ne sortent pas de la machine locale : elles transmettent des fichiers de descripteurs et offrent de meilleures performances pour l'IPC interne. Les serveurs à grande échelle utilisent souvent des sockets non bloquantes combinées à select, poll, epoll ou kqueue pour surveiller plusieurs connexions sans monopoliser des threads.

#3. Protocoles applicatifs

Construire une API par-dessus des sockets nécessite de définir un format de message (texte, binaire), un framing (longueur en tête, séparateur), un protocole d'erreur et, idéalement, une observabilité (logs structurés, métriques). Sans ces éléments, le moindre problème réseau devient difficile à diagnostiquer. Les sockets TLS viennent ajouter une couche de chiffrement et d'authentification, mais la logique applicative reste identique.

#Atelier

Implémentez un micro-serveur TCP qui renvoie l'heure courante à chaque client. Commencez avec des sockets bloquantes pour valider la logique, puis refaites le même exercice en mode non bloquant avec select. Sur la même base de code, créez une variante AF_UNIX afin de mesurer la différence de latence entre communication locale et réseau.