TP7 - Sockets
Le but de ce TP est de permettre à des programmes différents de communiquer via des sockets!
Exercice 0 - Instructions
Il y a un fichier à rendre pour chaque exercice.
- Exercice 1 : 3 points
- Exercice 2 : 7 points
Exercice 1 - nc
Nom du fichier de réponses : votrelogin_nc.md
Le but de cet exercice est de se familiariser avec les sockets en ligne de commande.
1.1 - Connecter deux nc
locaux
Rappels du cours
La commande nc
permet d'ouvrir des sockets, client ou serveur.
Par exemple, on ouvre une socket serveur sur le port 1234.
nc
acceptera la première connexion cliente puis fermera la socket serveur.
$ nc -l 1234
Exemple en ouvrant une communication en tant que client à l'autre commande :
nc
tentera de se connecter à la machine localhost
(alias pour la machine actuelle) sur le port 1234.
$ nc localhost 1234
Une fois la connexion établie, nc
connecte ses stdin
et stdout
à l'entrée et la sortie de sa socket.
Instructions
Ouvrir deux terminaux et connecter deux nc
sur le port 2024. Tenter d'écrire des lignes sur chaque terminal. Observer que les messages sont bien transférés d'un terminal à l'autre ou demander de l'aide si ça ne fonctionne pas.
Coller les deux commandes dans votre fichier de réponse
1.2 - requêtes HTTP avec curl
et nc
Rappel sur HTTP
HTTP est le protocole du web. Basé sur une connexion TCP, le protocole HTTP est un protocole client serveur.
Les connexions HTTP se font sur le port 80.
HTTP est un protocole plain-text, ce qui signifie que ses messages sont du texte lisible pour les humains. Voilà une requête HTTP minimale, qui correspond à http://cas.iut.univ-paris8.fr/login :
GET /login HTTP/1.1
Host: cas.iut.univ-paris8.fr
On note que la requête finit par deux retours à la ligne.
Voilà une réponse HTTP minimale que pourrait répondre un serveur web:
HTTP/1.1 200 OK
Content-Length: 32
Voilà le corps de la réponse !
On note que :
- la réponse sépare l'en-tête du corps de la réponse de deux retours à la ligne
- le header
Content-Length
indique la taille du corps de la réponse.
Instructions
On va accéder à cette ressource : http://cours.ppom.fr/test.txt.
- Faire d'abord la requête avec
curl
, une commande qui permet de faire des requêtes HTTP:
curl cours.ppom.fr/test.txt
- Faire ensuite la même requête à
cours.ppom.fr
avecnc
, en s'inspirant de la requête HTTP minimale indiquée plus haut.nc
ne sait pas parler de protocole en particulier : une fois la connexion établie, ce sera à vous de taper à la main votre requête HTTP.
Copier la commande
nc
, la requête et la réponse du serveur (qui contient plein de headers supplémentaires) dans le fichier de réponse.
1.3 - nc
à deux 🤝
La commande ip address
permet de récupérer des informations sur ses adresses IP.
Échanger son IPv4 avec son voisin (trouver celle qui commence par 192.168.
...) et communiquer avec nc
sur le port 4444.
Une personne doit lancer un serveur et l'autre un client.
Échanger.
Copier les deux commandes nc dans le fichier de réponse.
Exercice 2 - Morpion
On va faire un jeu de morpion en réseau.
Pour cela, on doit designer un protocole de communication entre les programmes qui vont communiquer ensemble.
Voilà le protocole de connexion :
- Le serveur ouvre le port et attend une connexion
- Un premier client s'y connecte
- Le serveur accepte la connexion, et en attend une seconde
- Un second client s'y connecte
- Le serveur ferme sa socket serveur : il n'acceptera pas d'autres connexions.
Voilà le protocole de communication :
- Le serveur envoie le plateau de jeu et toute autre information en plain text
- Les clients envoient un nombre de 1 à 9 pour indiquer sur quelle case ils jouent, comme le schéma du pavé numérique
Les clients seront de simples commandes nc
, et le serveur est à coder en C.
Pour gagner du temps, quelques fonctions ont déjà été codées :
Télécharger ces 4 fichiers et les placer dans son dossier du TP7.
Lire ces 4 fichiers pour comprendre leur fonction.
Le fichier s'appellera votrelogin_morpion.c
et sera le seul fichier à rendre pour cet exercice.
On partira de ce squelette de programme.
On le compilera avec la commande suivante :
gcc votrelogin_morpion.c morpion.c socket.c -o morpion
On utilisera les fonctions standards suivantes :
accept
, qui permet d'accepter une connexion. Prend en paramètre le descripteur de fichier d'une server socket et renvoie le descripteur de fichier d'une communication socket.read
, qu'on utilisera pour lire des caractères depuis les sockets. Renvoie-1
en cas d'erreur.dprintf
, qui s'utilise commefprintf
mais avec un descripteur de fichier à la place d'unFILE*
. On l'utilisera pour envoyer du texte à des clients.close
, qui permet de fermer un fichier/ une socket.
Exemples d'utilisation :
int com_socket = accept(server_socket, NULL, NULL);
char c;
int error = read(com_socket, &c, sizeof(char));
dprintf(com_socket, "Ça va ?\n");
close(server_socket);
close(com_socket);
Il "suffit" de suivre les TODO
dans le code, bon courage !