TP Sockets

Dominante INF & Filière Eurecom

Philippe Dax

SOMMAIRE

Notes préliminaires

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

    rendu-controle socket login1 login2 ...
    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 : -lnsl (pour htons,...)
    -lsocket (pour les sockets)

  • 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:
    if ((sock = socket(PF_INET, SOCK_STREAM, 0)) < 0) {
       perror("socket");
       ...
    }
    

    Codage d'un client/serveur en mode connecté

  • Exercice 1:

    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.

  • Exercice 2:

    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.

    Codage d'un client/serveur en mode non connecté

  • Exercice 3:

    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().

    Codage d'un serveur en mode inetd

  • Exercice 4:

    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