:: Enseignements :: Licence :: L3 :: 2016-2017 :: Programmation système en C ::
![[LOGO]](http://igm.univ-mlv.fr/ens/resources/mlv.png) | socket() connect() bind() listen() accept() |
Exercice 1 - Préparatifs
-
La commande netcat (nc) permet d'ouvrir des sockets en ligne de
commande. Elle permet d'être client ou serveur, et offre la possibilité
d'envoyer des contenus et de recevoir les réponses.
-
Lancer un nc en tant que serveur sur un port supérieur à 1024 sur votre machine.
Vérifiez qu'un autre utilisateur, sur un autre pc, peut se connecter à votre "serveur".
Essayez ensuite de trouver un solution pour passer le contenu d'un fichier d'une machine
à l'autre.
-
Utiliser nc pour ouvrir une socket connectée à
un serveur web en interne, par exemple igm. Pour rappel,
le serveur web tourne en général sur le port 80. La requete la plus simple à faire
est GET / (utilisez la pour récupérer la page index.html de
/~cherrier sur ce serveur igm).
-
Lancez maintenant un netcat en tant que serveur sur votre machine et faites pointer
un navigateur web sur ce serveur. Vérifiez les requetes émises par votre navigateur.
Pouvez-vous répondre ?
Exercice 2 - Tricoter une socket
Créer une socket avec l'appel système du même nom,
spécifier la famille d'adresse correspondant à Internet (AF_INET ou
PF_INET), demander une socket en mode connecté
(SOCK_STREAM), avec le protocole par défaut. Vérifier le
résultat de l'appel système.
Exercice 3 - Une fenêtre sur le monde
Sur vos machines, une
struct sockaddr_in a la forme suivante:
struct sockaddr_in{
sa_family_t sin_family; /* famille d'adresse : AF_INET, ...*/
in_port_t sin_port; /* No port. */
struct in_addr sin_addr; /* Adresse internet */
unsigned char sin_zero[sizeof (struct sockaddr) - /* Remplissage */
sizeof (sa_family_t) - /* jusqu'a */
sizeof (in_port_t) - /* la taille de*/
sizeof (struct in_addr)]; /* sockaddr */
};
struct in_addr{
uint32_t s_addr;
};
-
Afin de créer une socket en écoute, il faut remplir
une struct sockaddr_in, de famille AF_INET. Écrire
une fonction qui retourne une telle structure remplie avec un port
donné en argument, au dessus de 1024 (les ports en dessous de 1024
sont réservés au root); attention, il faut utiliser
htons pour mettre le numéro de port sous le bon format. Dans
le champ adresse de la structure, on mettra INADDR_ANY qui
signifie qu'on veut écouter sur toutes les interfaces de la machine.
-
Écrire une fonction qui étant donné un port, crée une
socket, utilise la fonction précédente pour
récupérer une struct sockaddr_in pour écouter sur ce port,
relie la socket à l'adresse grâce à bind(), puis met la
socket en écoute avec listen(). La fonction
retournera la socket en écoute.
-
Mettre la socket ainsi créée en attente de
connection avec accept. Cet appel est bloquant jusqu'à ce
que quelqu'un se connecte sur le port spécifié; il retourne alors un
descripteur sur une nouvelle socket qui permet de
communiquer, l'ancienne socket restant en écoute.
Écrire un programme qui écoute sur le port passé en argument, de
sorte que lorsque l'on se connecte (avec la commande telnet
par exemple), le message "Bonjour" s'affiche. Essayez de vous
connecter au programme tournant sur la machine voisine.
-
Faire une communication très simple entre le telnet et le
serveur. Par exemple le serveur demande d'entrer son nom, puis
affiche bonjour, le_nom et déconnecte l'utilisateur. Puis le
serveur attend une nouvelle connection (revenir dans la boucle
accept()).
Exercice 4 - Connecter les gens
-
Écrire une fonction qui, étant donné un port et un nom de machine,
retourne une struct sockaddr_in remplie avec les informations
correspondantes (on utilisera gethostbyname() pour remplir le
champ sin_addr).
-
Utiliser connect pour écrire une fonction qui retourne une
socket connectée à la machine spécifiée sur le port
voulu.
-
Écrire un programme susceptible de gérer le dialogue proposé par un
serveur écrit à la question précédente.
-
Modifier vos programmes afin d'établir un mini-talk entre un serveur et
un client qui écrivent à tour de rôle.
Exercice 5 - Un grand navigateur
Se connecter sur le port 80 à la machine igm.univ-mlv.fr,
envoyer la requête "get http://igm.univ-mlv.fr/ens/ HTTP/1.0\n\n" et lire
le résultat. Vous êtes prêt à écrire un navigateur...
© Université de Marne-la-Vallée