Sorbonne Université Master 2017 2018
PR : Travaux Dirigés 8. Introduction aux sockets

Cette première séance consacrée aux sockets est structurée ainsi :

Comme d’habitude, on trouvera un Makefile avec un premier but compilant tous les exercices, et un but test lançant tous les tests. On notera que dans cette suite de tests, les serveurs sont lancés avant les clients et en tâche de fond ce qui permet à cette suite d’aller à son terme, avec la contrepartie que les serveurs resteront actifs.



1 Remontée de valeurs par communication distante

Reprendre l’exercice Remontée de valeurs par partage de mémoire pour que les valeurs aléatoires transmises par les fils au père passent non plus par un segment de mémoire partagée, mais par datagrammes UDP. Le programme devra créer une socket UDP et la rendre accessible par bind, en la nommant grâce à la structure sockaddr_un propre au domaine af_unix des sockets. Il l’utilisera à la fois pour les envois (par sendto) et les réceptions (par recvfrom) de datagrammes (évidement d’autres solutions seraient possibles). Le programme prendra en premier argument le nom de la socket, et en deuxième argument le nombre de processus à créer.

Remarque : afin de permettre plusieurs exécutions de ce programme, veiller avant sa terminaison à appliquer unlink sur le nom de la socket afin de le rendre disponible.

Exemple d'appel :
$PWD/bin/remonte_udp sockudp 4
Fichier à créer : src/remonte_udp.c

2 Serveur d’environnement

On souhaite réaliser un mini-serveur d’environnement qui communique par UDP sur un port dont le numéro est donné sur la ligne de commande du serveur à son démarrage. Ce qu’on appelle ici un environnement est une liste de couples identificateur, valeur. Les identificateurs et les valeurs sont de type chaîne de caractères.

Le serveur reconnait deux opérations :

Pour éviter d’avoir à définir et à gérer une structure de données, on pourra utiliser directement l’environnement du processus serveur via les fonctions getenv et setenv.

Exemple d'appel :
$PWD/bin/env_serveur 2001 &
Fichier à créer : src/env_serveur.c

3 Un client pour l’environnement

Le client du programme précédent prend sur la ligne de commande l’adresse du serveur et son port. Ensuite il lit sur le flux d’entrée une suite de requêtes dont chacune doit avoir l’une des formes suivantes :

Le client construit le message correspondant à la requête et envoie ce message au serveur en utilisant une socket et le protocole UDP. Il attend alors la réponse du serveur et l’envoie sur le flux de sortie.

Exemple d'appel :
echo "S USER moi;G USER;Q;"|tr ";" "\n"|$PWD/bin/env_client 127.0.0.1 2001
Fichier à créer : src/env_client.c

4 Réception d’un fichier par socket

On souhaite écrire un programme attendant sur un port une demande de connexion de la part d’un client. Ce programme prend en ligne de commande le numéro du port sur lequel il attend les demandes de connexion. Lorsqu’une connexion s’ouvre, il lit la première ligne envoyée et considère que c’est le nom d’un fichier ; il crée alors dans son répertoire d’exécution un fichier vide portant ce nom. Il lit ensuite les données transmises jusqu’à la fin de la connexion, et les recopie dans le fichier créé précédemment.

Le programme récepteur stocke les fichiers recopiés dans son répertoire d’exécution.

Exemple d'appel :
$PWD/bin/recvfile 2000 &
Fichier à créer : src/recvfile.c

5 Envoi d’un fichier par socket à un récepteur

On souhaite écrire un programme transmettant au programme précédent le contenu d’un fichier, au moyen d’une connexion TCP.

Le programme prend en ligne de commande :

Lorsqu’il obtient sa connexion avec le programme récepteur, il envoie d’abord le nom du fichier, puis le contenu de celui-ci.

Exemple d'appel :
$PWD/bin/sendfile 127.0.0.1 2000 makefile
Fichier à créer : src/sendfile.c

6 Annexes


makefile