III. Communication par sockets TCP
Cours

3. Serveur TCP concourant et clients TCP

On va écrire client.c et server.c qui font plusieurs échanges d'objets à chaque connexion, server.c étant capable de gérer plusieurs connexions simultanées.

server.c utilisera la même méthode que serv.c (capture signal) pour gérer les terminaisons des fils et accepter plusieurs clients simultanés

client.c va envoyer à server.c un message de requête (on utilisera pour simplifier l'envoi d'un objet "obj"), puis boucler sur la lecture de data en réponse à sa requête

Attention

client.c NE SAIT PAS combien d'octets devront être lus pour avoir la totalité de la réponse et ne devra pas se mettre en situation bloquante en essayant de lire trop de données.

Il faudra donc utiliser un protocole "applicatif" qui décrit la façon dont la réponse du serveur est envoyée au client.

Après lecture de la réponse, le client envoi une requête "fin" indiquant au serveur que cette connexion peut être fermée.

On remarquera que l'on se trouve ici avec un problème similaire à celui du programme "forkpipe.c" du TD 01. Rappel de la problématique :

On a deux grands choix :

  • travailler sur le contenant : encapsulation des données utiles dans des données de gestion;

  • travailler sur le contenu : utiliser des marqueurs de début et/ou de fin de messages. Ceci suppose que les marqueurs ne sont jamais présents dans les données, ce qu'on peut assurer par des techniques d'échappement.

Figure 1
Figure 1

L'important est de pouvoir assurer une extraction fiable, depuis le flux, d'une série de messages de longueur différentes, ces longueurs n'étant pas connues à l'avance, mais découvertes au fur et à mesure de la lecture du flux.

Exemple d'exécution :

[sr03@nat7 td3]$ ./server

o= ident_o1 description_o1 11 12 1.023450e+01

o= ident_o3 description_o3 -1 32 3.023450e+01

sero - init socketAttachement reussi- Attente connexion.

Connexion etablie. Fork pour traiter.

o= dummy -dummy- 1 2 1.234500e+00

connexion client traitée par pid=12309

o= dummy -dummy- -1 2 1.234500e+00

handler fin fils pid=12309 code=1

handler: No child processes

[sr03@nat7 td3]$ ./client

Connexion etablie. Envoi messages.

reçu liste lng=3 obj 11 nbre=3 obj 101 nbre=2 obj 102 nbre=12 obj 103 nbre=5

reçu liste lng=-1 obj -1 nbre=-1

Exit.

2. On transforme le serveur TCP simple en un vrai serveur concourant (page Précédente)
AccueilImprimerRéalisé avec SCENARI