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.

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.