chriskang
Messages postés8Date d'inscriptionlundi 6 septembre 2004StatutMembreDernière intervention26 avril 2011
-
29 oct. 2004 à 15:12
chriskang
Messages postés8Date d'inscriptionlundi 6 septembre 2004StatutMembreDernière intervention26 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...
cs_aardman
Messages postés1905Date d'inscriptionmercredi 22 janvier 2003StatutMembreDernière intervention17 septembre 20123 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.
leprov
Messages postés1160Date d'inscriptionvendredi 23 juillet 2004StatutMembreDernière intervention21 octobre 201017 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.......
chriskang
Messages postés8Date d'inscriptionlundi 6 septembre 2004StatutMembreDernière intervention26 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).