begin process at 2010 03 21 23:48:55
  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 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 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 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 Traitement d'image [ par GMeryam ] Bonjour, Je dois avoir une idée sur les différents applications de traitement d'images sous Matlab. S'il vous plait si vous avez des cours et des trav [BAR]Traitement de texte pour une langue non latin [ par abayane ] Bonjour tout le monde, Bon je veut développé un editeur de texte pour langue non doté (non latin),merci de me paratger des idées a propos de ça,pour 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'images et corrélation [ par perigv ] Bonjour à tous,J'aurais bien besoin d'un coup de main.J'ai commencer à réaliser un petit programme qui me permettra de comparer deux images que je cha


Nos sponsors


Sondage...

CalendriCode

Mars 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

 
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 : 0,515 sec (3)

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