TP Sockets
Dominante INF & Filière Eurecom
Philippe Dax
SOMMAIRE
Répertoire de travail
Créez un répertoire spécifique pour les exercices,
par exemple tp-socket,
ensuite placez vous dans ce répertoire pour écrire vos programmes.
Vous enverrez, en restant dans ce répertoire, le(s) fichier(s) source(s)
traitant l'exercice et le Makefile
permettant leur bonne utilisation en tapant la commande suivante:
Oł login1, login2 sont les noms de login des élèves qui
partagent la même station de travail.
Si l'élève est seul sur la station, seul login1 est à fournir.
Makefile
Etant donné que chaque exercice fait intervenir plusieurs fichiers
(client, serveur) et différents modes d'utilisation (mode connecté,
mode non connecté), implémentations (standalone, inetd),
il est nécessaire de construire un fichier Makefile
pour construire les différents exécutables.
Edition des liens
Sur une station de travail Solaris, ajouter à l'édition de liens :
Cas d'erreurs des appels système
Il est nécessaire de tester la valeur rendue par chaque
appel système avant de poursuivre le code du programme.
Dans la majorité des cas, lorsqu'un appel système echoue,
il renvoie un code d'erreur de (-1), mais n'indique aucune
autre information sur le type d'erreur qui s'est produit.
Afin de connaitre cette information, il faudra utiliser la
fonction perror() dont le seul argument est une chaine
de caracteres de votre choix sans '\n', mais en général on y met le nom
de l'appel système qui vient d'échouer, par exemple:
On vous fournit un squelette de code du serveur
srvtcp.todo
que vous devez recopiez par <Shift-Click> sur cette URL,
puis renommer en srvtcp.c,
et enfin compléter à partir des éléments du cours.
On nommera le serveur srvtcp.
Puisqu'il s'agit d'un serveur basic, celui renverra au client
une chaine de caracteres quelconque. Sinon on pourrait
imaginer que le serveur lise un fichier local ou fasse
un traitement dynamique sur les ressources machine qu'il peut voir
(par exemple, un ps, un df, un w,...).
On lancera le serveur en background (svrtcp &).
Pour tuer le serveur, soit revenir en foreground (fg) et faire
<Ctrl-C>, soit tuer le processus par kill après l'avoir
repairé par "ps ax".
On remarquera que si on relance le serveur apra l'avoir
tué, une erreur de bind() se produit disant que le port est
"already busy". Pour éviter cette erreur il faudra placer
un appel de setsockopt() avec l'option REUSE_ADDR avant le bind(),
voir man setsockopt.
On vous fournit un squelette de code du client
clitcp.todo
que vous devez recopiez par <Shift-Click> sur cette URL,
puis renommer en clitcp.c,
et enfin compléter à partir des éléments du cours.
On nommera le client clitcp.
Puisqu'il s'agit d'un client basic, on lui demandera de lire
tout simplement sur l'entrée standard <stdin>
du clavier et d'envoyer au serveur ce qui a été tapé.
On lancera le client en foreground, afin d'avoir le contrôle
du clavier pour envoyer les messages. Les 2 arguments sur la ligne
de commande du client seront d'une part le nom du host oł se
trouve le serveur et d'autre part le numéro du port sur lequel
ce dernier écoute, en l'occurrence 45678.
On vous demande maintenant modifier les codes précédents du serveur
et du client de telle sorte que la communication entre le nouveau
serveur et le nouveau client se fasse en mode non connecté,
c'est-à-dire en mode datagramme sans établissement préliminaire
de la communication.
On nommera le serveur srvudp et le client cliudp
qui seront recopiés respectivement à partir des sources
srvtcp.c et clitcp.c..
Puisque le mécanisme d'établissement de communication disparait
il faudra supprimer le listen() et l'accept() côté serveur et
le connect() côté client. D'autre part, les read() et les write()
du serveur et du client seront respectivement remplacés par
recvfrom() et sendto().
Modifier le serveur srvtcp.c pour qu'il puisse être appelé
directement par le service inetd.
On nommera ce serveur srvinettcp.
© (Copyright) Philippe Dax - 1999