[C++] Socket & Synchro write/read

Socket & Synchro write/read [C++] - C++ - Programmation

Marsh Posté le 07-04-2005 à 19:55:26    

J'ai un petit soucis pour synchroniser la communication entre un serveur et un client.
Mon serveur envoit des données au client, en faisant plusieurs write ... en gros :
 
       Serveur                     Client
write(fd,"TEST1",5)              read(fd,bufTEST1,bufsize)
write(fd,"TEST2",5)              read(fd,bufTEST2,bufsize)
write(fd,"TEST3",5)              read(fd,bufTEST3,bufsize)
write(fd,"TEST4",5)              read(fd,bufTEST4,bufsize)
 
Tout fonctionne bien jusqu'au TEST4 ... mes 3 1ers read recoivent bien chacun TEST1,2 et 3, mais le dernier ne recoit rien du tout et attend indéfiniement.
Ce qui se passe apparemment, c'est que le write pour TEST4 se lance et renvoit 5, alors que aucun read n'est activé coté client. Le client lance ensuite son read pour le TEST4 mais ne recoit rien, puisque le write a déjà été fait pour le TEST4.  
 
Est il possible d'effectuer une synchro pour que chaque read recoivent correctement le write qui lui est associé ? Pour l'instant j'ai resolu le probleme en faisant un sleep après chaque write, mais j'espère un peu plus "propre" comme solution.

Reply

Marsh Posté le 07-04-2005 à 19:55:26   

Reply

Marsh Posté le 07-04-2005 à 20:11:42    

"TEST4",5
 
eux ca fait 6 la

Reply

Marsh Posté le 07-04-2005 à 20:15:16    

Taz a écrit :

"TEST4",5
 
eux ca fait 6 la


 
C'était pour l'exemple, concretement je fais un monstring.length() +1, donc pas de soucis :)

Reply

Marsh Posté le 07-04-2005 à 20:17:21    

Tu utilises quel protocole ?

Reply

Marsh Posté le 07-04-2005 à 20:42:10    

J'utilise TCP : socket(PF_INET, SOCK_STREAM, 0);
 
Je vais faire un test, j'ai peut être une idée de où passe mon TEST4.


Message édité par Slayne le 07-04-2005 à 20:42:57
Reply

Marsh Posté le 07-04-2005 à 20:49:10    

Bon bah test echoué ... je pensais que le write du TEST4 serait lu par le read du TEST3, mais en fait non, le READ du TEST 3 ne lit uniquement que le WRITE du TEST3 ...  :sweat:  
 
Mais où passe ce TEST4 ?  :sweat:

Reply

Marsh Posté le 07-04-2005 à 20:59:38    

Essaye de sniffer avec un soft ethereal
et sinon, une autre piste:

Citation :

You're probably seeing Nagle buffering. That can be disabled on Windows (and pretty much everywhere
else) by calling setsockopt with the TCP_NODELAY option.
 
Doing this will chew more bandwidth and more CPU at each end,
though. UDP may be a better match for your application, I think.


C'est tiré d'un sujet sur Qt, à voir ce que ça peut donner dans ton cas...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed