Programmation TCP
0.1 Exercice 1
Ecrire :
- un client TCP
client8qui envoie deux entiers au serveur, sous la forme d’un seulsendde 8 octets, et qui récupérera la somme - un serveur TCP
server8qui récupère les deux entiers avec un seulrecv(8), en fait la somme, et la renvoie au client. - un client TCP
client4qui fait la même chose, mais qui envoie les deux entiers avec deuxsendde 4 octets. - un serveur TCP
server4qui récupère les deux entiers avec deuxrecv(4), en fait la somme, et la renvoie au client.
On veillera à bien gérer les erreurs.
1 Exercice 2
On rappelle que TCP est un protocole en mode flux et non pas message. Quand on demande l’envoi de 8 octets comme dans client8, il est possible que cet envoi se fasse en 3 messages de 2,3, et 3 octets par exemple.
Pour cet exercice, on part de l’hypothèse que:
client8a envoyé les 8 octets en un seul message, qui est bien reçu par le serveurclient4a envoyé les 8 octets en deux messages de 4 octets, qui sont bien reçus par le serveur
Il faut répondre aux questions de cet exercice dans un fichier README.md
Au vu des captures wireshark réalisées précédemment, est-ce que l’hypothèse est bien vérifiée ? Vérifiez avec votre chargé de TP.
Est-ce que
client8.pyest compatible avecserver4.py? Justifier. (Attention: ce n’est pas parce que tout a fonctionné correctement quand vous lancez l’expérience que les programmes sont compatibles. Vous avez peut-être eu de la chance). Vérifiez avec votre chargé de TP.Est-ce que
client4.pyest compatible avecserver8.py? Justifier. Vérifiez avec votre chargé de TP.
1.1 Exercice 3
Dupliquer les 4 fichiers
client4,server4,client8,server8ennewclient4,newserver4,newclient8,newserver8.Créer un fichier
functions.pyL’instruction
recv(n)signifie “recevoir au maximum n octets”. Ecrire dans le fichierfunctions.pyune fonctionreally_recv(s, n)qui prend en argument une socket et un entier n et qui reçoit exactement n octets, en appellant éventuellement plusieurs foisrecvsi on en a pas assez la première fois. Faites attention au cas où la fonctionrecvrenvoie 0 octets (ce qui signifie que la connection est fermée)L’instruction
send(message)renvoie un entier qui est le nombre d’octets réellement envoyés. Il peut être inférieur à la taille complète du message, si jamais TCP n’a pas réussi à tout envoyer. Ecrire dans le fichierfunctions.pyune fonctionreally_send(s,message)qui prend en argument une socket et un message et qui envoie tout le message, en appellant éventuellement plusieurs foissendsi nécessaire.Modifiez les fichiers
newclient4,newserver4,newclient8,newserver8pour qu’ils utilisent ces nouvelles commandes.Est-ce que
newclient4.pyest maintenant compatible avecnewserver8.py? Justifier.Est-ce que
newclient8.pyest maintenant compatible avecnewserver4.py? Justifier.
1.2 Exercice 4
Dupliquer les 2 fichiers
newclient4,newserver4enfinalclient4etfinalserver4Modifier le client pour qu’il commence d’abord par se connecter, puis demande premier entier, puis l’envoie, puis demande le deuxième entier et l’envoie (il est possible que vous n’ayez rien à modifier)
Ajouter un
while Trueau serveur pour qu’il puisse gérer plusieurs clients consécutivement.Essayez d’appuyer à plusieurs moments sur ctrl-C pendant l’exécution du client. Notez ce qui se passe niveau serveur. Arrangez vous pour que :
- Le serveur ne plante jamais
- Le serveur n’envoie rien au client si celui-ci a planté.