L’objectif de ce TD de finir d’aborder la communication sur réseau par les sockets, en exploitant les connaissances vues au cours des TDs précédents.
Cet exercice a pour but d’ouvrir une partie de la connexion réseau (celle du serveur, connexion appelée socket).
Créez un programme qui établit attend une connexion (qu’on établira avec telnet) et quitte. Les étapes sont les suivantes:
socket(2)
. Ouvrir une socket pour communiquer sur internet (IPv4, flag AF_INET
) en mode connecté, duplex (flag SOCK_STREAM
) et laissez le système choisir le protocole (flag 0). La socket sera fermée à la fin du programme par un appel à close(2)
sockaddr_in
qui contient les champs:sin_family
: utiliser AF_INET
pour protocole internetsin_addr.s_addr
: utiliser INADDR_ANY
pour que le système choisisse l’adresse internet de la machinesin_port
: le numéro du canal de communication, appelé port. C’est un entier quelconque, >1024
. Attention, utiliser les convertisseurs htons(3),...
pour que le codage des entiers soit bien celui du réseau, pas celui de la machine.sockaddr_in
et la socket à bind(2)
.listen(2)
et spécifier le nombre d’entrées dans la file d’attente des demandes de connexion.accept(2)
. Les deux derniers arguments seront mis à nul. Le descripteur de socket retourné peut être manipulé comme un descripteur de fichier.telnet
pour établir une connexion), fermer le descripteur de socket retourné par accept(2)
et par socket(2)
.Un serveur echo accepte les connexions comme dans l’exercice précédent et renvoie au client tout ce qu’il a reçu, tant qu’il ne reçoit pas “quit”. Quand il reçoit “quit”, il ferme la communication avec le client et se remet en attente d’autres connexions. Les échanges avec les clients qui se connectent se font grâce à read(2)
et write(2)
sur le descripteur obtenu par accept(2)
.
fork(2)
pour pallier ce problème.Un serveur web accepte les connexions comme dans l’exercice précédent. Le protocole est le suivant:
GET fichier
où fichier est le fichier à récupérer par le serveur web (un fichier html par exemple).HTTP/1.0 200 OK\r\nContent-Type: text/html\r\n\r\n
suivie du contenu du fichier
Le type du fichier peut être adapté (ici text/html
) suivant qu’il s’agit d’un fichier html, jpg, png…
stat(2)
pour savoir si le fichier demandé existe et avoir sa taille, et mmap(2)
pour le mettre en mémoire et ainsi l’envoyer avec write(2)
.