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 - 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 :


Instructions

On va accéder à cette ressource : http://cours.ppom.fr/test.txt.

  1. Faire d'abord la requête avec curl, une commande qui permet de faire des requêtes HTTP:
curl cours.ppom.fr/test.txt
  1. Faire ensuite la même requête à cours.ppom.fr avec nc, 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 :

Voilà le protocole de communication :

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 :

  1. Pour le morpion : morpion.c, morpion.h
  2. Pour les sockets : socket.c, socket.h

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 :

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 !

Démo