2 send, 1 seul recv

Résolu
chriskang Messages postés 8 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 avril 2011 - 29 oct. 2004 à 15:12
chriskang Messages postés 8 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 avril 2011 - 1 nov. 2004 à 23:55
J'ai créé une application de type client-serveur qui réagit bizarrement lorsque je fais plusieurs send consécutifs vers une même socket.

Au cours de mes tests pour débugger, j'ai pu observer le comportement suivant :
Sur le serveur, je fais
int a = send (sock1, ..., ...)
int b = send (sock1, ..., ...)
avec un printf, je controle les valeurs de a et de b qui sont respectivement 8 et 9, ce qui signifie que les deux envois se sont bien passés et qu'il a envoyé 2 chaines de caractères (l'une de taille 8, l'autre de taille 9).
Sur le client, j'ai un thread de réception qui lance un autre thread pour le traitement dès qu'il recoit des données. Le code est du style :
while (1)
{
nbrecu = recv(sock2, ..., ...);
if (nbrecu > 0) CreateThread (..., traitement, ...)
}
L'ennui, c'est qu'avec tout ca, la valeur de nbrecu au moment de la réception est 17, soit 8+9, ce qui signifie qu'il m'a concaténé le contenu des deux messages (et effectivement, c'est ce que j'observe dans mon traitement de réception).

Y'a t il un moyen d'empecher cette concatenation? J'ai essayer de désactiver l'algorithme de Nagle dans les socket mais ca n'a rien changé.
Si quelqu'un a une idée...

D'avance merci.

3 réponses

cs_aardman Messages postés 1905 Date d'inscription mercredi 22 janvier 2003 Statut Membre Dernière intervention 17 septembre 2012 3
29 oct. 2004 à 17:24
Salut,
Ca n'a rien a voir avec l'algorythme de Nagle, c'est le protocol TCP qui est fait comme ca.

Si tu veux 1 send = 1 recv, il faut utiliser le protocol UDP, ou alors il faut mettre une entete a tout tes "message" (entre guillemets, car en TCP ce ne sont pas vraiment des messages) pour pouvoir determiner si tu a recu un ou plusieurs "messages" lors d'un recv.
3
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
29 oct. 2004 à 21:02
effectivement, quand tu envoies des données dans ton socket tu as un buffer qui correspond a ta socket qui est créé et tes octets sont concaténés ds ta socket. tu as deux solutions, la premiere, pas top mais econome en place serait de n'ecrire dans ta socket que si le buffer est vide (donc qu'un receive aies deja été fait), la deuxieme est que comme t'as dit aardman tu mettes une entete a tes messages qui donne le nombre d'octets a lire dans le socket, et ainsi tu lis les octets suivants comme données par ton entete. par exemple tu decide que ton entete est un int, donc tu lis les 4 premiers octets dans un int, puis tu lis le nombre d'octets donnés par ce nombre. tu as ton send qui correspond a ton receive.......
0
chriskang Messages postés 8 Date d'inscription lundi 6 septembre 2004 Statut Membre Dernière intervention 26 avril 2011
1 nov. 2004 à 23:55
Merci pour votre contribution à tous les deux, je vais utiliser votre proposition (celle qui consiste à mettre la taille des données en tête de message).
0
Rejoignez-nous