begin process at 2012 02 10 18:02:19
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Réseau / Internet

 > 

2 send, 1 seul recv


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

2 send, 1 seul recv

vendredi 29 octobre 2004 à 15:12:29 | 2 send, 1 seul recv

chriskang

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.

--
Chris
vendredi 29 octobre 2004 à 17:24:38 | Re : 2 send, 1 seul recv

aardman

Membre Club
Réponse acceptée !
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.
vendredi 29 octobre 2004 à 21:02:08 | Re : 2 send, 1 seul recv

leprov

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.......
lundi 1 novembre 2004 à 23:55:24 | Re : 2 send, 1 seul recv

chriskang

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).

--
Chris


Cette discussion est classée dans : send, traitement, réception, recv, nbrecu


Répondre à ce message

Sujets en rapport avec ce message

TELNET aide sur RECV ? [ par hergo ] bonjour jai besoinr daide ssur mon serveur telnet :Je suis sous NT en language C/C++ avec Borland builder Xquand je le lance tout fonction , il attend Blocage socket recv() lorsque send() a envoyé 1418 octets - entre 2 freebox [ par billbaxter ] Bonjour, J'ai développé une appli client-serveur avec les winsock2 en me référant aux exemples MSDN, donc à priori dans les règles de l'art.Le client send et recv dans le meme programme [ par obader ] Salut a tous J'ai fait un petit programme client qui se connecte à un seveur téléphonique, mon programme contient un snd suivi d'un recv, le snd march Fonctions send et recv [ par bubbless ] Bonjour, Dans le cadre d'un projet, je réalise actuellement un système serveur / client, et je me trouve confronté à un probème : le serveur acc Probleme Architecture client Serveur Multithread [ par kawito ] Bonjour,j'ai fais un client serveur TCP qui doit gerer n connexions(win32 c++) winsowk1.1.le serveur gere les connexions a travers un thread acceptqui send et recv [ par StayCrunchy ] Bonsoir, J'ai un petit soucis avec les fonctions send et recv. j'ai fait un petit programme qui permet d'envoyer un fichier d'un serveur à un client. sockets send() recv() [ par dletozeun ] bonjour,j'essais de faire communiquer 2 progs avec les sockets et send() et recv() est il possible d'envoyer autre chose qu'une chaine avec la fonctio sockets: fonction recv()!!!!! [ par dletozeun ] bonjour,j'essais de faire communiquer 2 programmes avec les sockets.J'utilise la fonction recv():recv(m_socket,recvbuf,50,0);mais j'ai beau effacer la traitement d'image [ par bobob ] Bonsoir j'espere que quelqu'un pourra m'aider à résoudre mon problème qui me bloque depuis des jours :( je programme en C , j'ai chargé mon image a determination du point d'intersection de plusieurs cercles dans une image (traitement d'image) [ par noussagh ] Bonsoir Comment je peux déterminer les coordonnées du point d'intersection de plusieurs cercles sur une image binarisée?


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2012
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
272829    

Consulter la suite du CalendriCode

Photothèque

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,278 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales