Pb de causerie socket client/serveur

Le
zkoubidou
Bonjour,
Voila mon problème: je récupère dans data ce que m'envoie un client que je
charge dans "msg". Si le contenue de data vaut "IDEXP", je veux répondre
"OK". Je charge la chaine "OK" dans "myWriteBuffer" et je fais
stream.Write(myWriteBuffer, 0, myWriteBuffer.Length)rienne remonte vers le
client Par contre si derrière je fais un stream.Write de "msg" (en
commentaire dans l'exemple), dans le client j'obtiens une réponse avec les
deux stream.Write.Dès que je remets en commentaire le stream.Write "msg" je
n'ai plus de réponse
Je dois louper un truc mais je sais pas quoi.
Merci d'avance pour votre aide.

Int32 i;
while((i = stream.Read(bytes, 0, bytes.Length))!=0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
data = data.ToUpper();
Byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
if(data.CompareTo("IDEXP")==1)
{
Byte[] myWriteBuffer = Encoding.ASCII.GetBytes("OK");
stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
//stream.Write(msg, 0, msg.Length);
}
else
{
Byte[] myWriteBufferError = Encoding.ASCII.GetBytes("ERROR");
stream.Write(myWriteBufferError, 0, myWriteBufferError.Length);
//stream.Write(msg, 0, msg.Length);
}
  • Partager ce contenu :
Vos réponses
Trier par : date / pertinence
Paul Bacelar
Le #12291261
Avez-vous pris en compte que les socket TCP font de la bufferisation à
l'émission.
--
Paul Bacelar
MVP VC++

"zkoubidou" news:
Bonjour,
Voila mon problème: je récupère dans data ce que m'envoie un client que je
charge dans "msg". Si le contenue de data vaut "IDEXP", je veux répondre
"OK". Je charge la chaine "OK" dans "myWriteBuffer" et je fais
stream.Write(myWriteBuffer, 0, myWriteBuffer.Length)...rienne remonte vers
le
client... Par contre si derrière je fais un stream.Write de "msg" (en
commentaire dans l'exemple), dans le client j'obtiens une réponse avec les
deux stream.Write.Dès que je remets en commentaire le stream.Write "msg"
je
n'ai plus de réponse...
Je dois louper un truc mais je sais pas quoi.
Merci d'avance pour votre aide.

Int32 i;
while((i = stream.Read(bytes, 0, bytes.Length))!=0)
{
data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
data = data.ToUpper();
Byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
if(data.CompareTo("IDEXP")==1)
{
Byte[] myWriteBuffer = Encoding.ASCII.GetBytes("OK");
stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
//stream.Write(msg, 0, msg.Length);
}
else
{
Byte[] myWriteBufferError = Encoding.ASCII.GetBytes("ERROR");
stream.Write(myWriteBufferError, 0, myWriteBufferError.Length);
//stream.Write(msg, 0, msg.Length);
}


zkoubidou
Le #12291251
Bonjour,
Et bien je pense...
Ce matin j'ai essayé:
Byte[] myWriteBuffer = Encoding.ASCII.GetBytes("OK");
stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
//stream.Write(msg, 0, msg.Length);

--> je n'ai pas de réponse... Si j'enlève le commentaire du dernier
stream.Write, j'obtiens en réponse sur le client:
OKOKOKIDEXP ( les 4 stream.Wirte)...
Je compreds par pourquoi sans le stream.Write des datas reçues (msg) je ne
réponds pas.
Mercide votre aide...

"Paul Bacelar" a écrit :

Avez-vous pris en compte que les socket TCP font de la bufferisation à
l'émission.
--
Paul Bacelar
MVP VC++

"zkoubidou" news:
> Bonjour,
> Voila mon problème: je récupère dans data ce que m'envoie un client que je
> charge dans "msg". Si le contenue de data vaut "IDEXP", je veux répondre
> "OK". Je charge la chaine "OK" dans "myWriteBuffer" et je fais
> stream.Write(myWriteBuffer, 0, myWriteBuffer.Length)...rienne remonte vers
> le
> client... Par contre si derrière je fais un stream.Write de "msg" (en
> commentaire dans l'exemple), dans le client j'obtiens une réponse avec les
> deux stream.Write.Dès que je remets en commentaire le stream.Write "msg"
> je
> n'ai plus de réponse...
> Je dois louper un truc mais je sais pas quoi.
> Merci d'avance pour votre aide.
>
> Int32 i;
> while((i = stream.Read(bytes, 0, bytes.Length))!=0)
> {
> data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
> data = data.ToUpper();
> Byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
> if(data.CompareTo("IDEXP")==1)
> {
> Byte[] myWriteBuffer = Encoding.ASCII.GetBytes("OK");
> stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
> //stream.Write(msg, 0, msg.Length);
> }
> else
> {
> Byte[] myWriteBufferError = Encoding.ASCII.GetBytes("ERROR");
> stream.Write(myWriteBufferError, 0, myWriteBufferError.Length);
> //stream.Write(msg, 0, msg.Length);
> }





Simon Mourier [SoftFluent]
Le #12291241
Comme l'indique Paul Bacelar, ceci à peut-être rapport avec l'algorithme
TCP/IP "Nagle". On utilise SocketOptionName.NoDelay pour le désactiver. cf
ici

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemnetsocketssocketoptionnameclasstopic.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemnetsocketstcpclientclassnodelaytopic.asp
http://www.dotnet247.com/247reference/msgs/53/269540.aspx

Simon.
www.softfluent.com


"zkoubidou" news:
Bonjour,
Et bien je pense...
Ce matin j'ai essayé:
Byte[] myWriteBuffer = Encoding.ASCII.GetBytes("OK");
stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
//stream.Write(msg, 0, msg.Length);

--> je n'ai pas de réponse... Si j'enlève le commentaire du dernier
stream.Write, j'obtiens en réponse sur le client:
OKOKOKIDEXP ( les 4 stream.Wirte)...
Je compreds par pourquoi sans le stream.Write des datas reçues (msg) je ne
réponds pas.
Mercide votre aide...

"Paul Bacelar" a écrit :

Avez-vous pris en compte que les socket TCP font de la bufferisation à
l'émission.
--
Paul Bacelar
MVP VC++

"zkoubidou" news:
> Bonjour,
> Voila mon problème: je récupère dans data ce que m'envoie un client que
> je
> charge dans "msg". Si le contenue de data vaut "IDEXP", je veux
> répondre
> "OK". Je charge la chaine "OK" dans "myWriteBuffer" et je fais
> stream.Write(myWriteBuffer, 0, myWriteBuffer.Length)...rienne remonte
> vers
> le
> client... Par contre si derrière je fais un stream.Write de "msg" (en
> commentaire dans l'exemple), dans le client j'obtiens une réponse avec
> les
> deux stream.Write.Dès que je remets en commentaire le stream.Write
> "msg"
> je
> n'ai plus de réponse...
> Je dois louper un truc mais je sais pas quoi.
> Merci d'avance pour votre aide.
>
> Int32 i;
> while((i = stream.Read(bytes, 0, bytes.Length))!=0)
> {
> data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
> data = data.ToUpper();
> Byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
> if(data.CompareTo("IDEXP")==1)
> {
> Byte[] myWriteBuffer = Encoding.ASCII.GetBytes("OK");
> stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
> //stream.Write(msg, 0, msg.Length);
> }
> else
> {
> Byte[] myWriteBufferError = Encoding.ASCII.GetBytes("ERROR");
> stream.Write(myWriteBufferError, 0, myWriteBufferError.Length);
> //stream.Write(msg, 0, msg.Length);
> }







zkoubidou
Le #12291221
Oups !! Sorry mais en fait l'appli cliente attendait un caractère non
imprimable...
Désolé pour le dérengement..
Et merci pour vos réponses.

"Simon Mourier [SoftFluent]" a écrit :

Comme l'indique Paul Bacelar, ceci à peut-être rapport avec l'algorithme
TCP/IP "Nagle". On utilise SocketOptionName.NoDelay pour le désactiver. cf
ici

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemnetsocketssocketoptionnameclasstopic.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemnetsocketstcpclientclassnodelaytopic.asp
http://www.dotnet247.com/247reference/msgs/53/269540.aspx

Simon.
www.softfluent.com


"zkoubidou" news:
> Bonjour,
> Et bien je pense...
> Ce matin j'ai essayé:
> Byte[] myWriteBuffer = Encoding.ASCII.GetBytes("OK");
> stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
> stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
> stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
> //stream.Write(msg, 0, msg.Length);
>
> --> je n'ai pas de réponse... Si j'enlève le commentaire du dernier
> stream.Write, j'obtiens en réponse sur le client:
> OKOKOKIDEXP ( les 4 stream.Wirte)...
> Je compreds par pourquoi sans le stream.Write des datas reçues (msg) je ne
> réponds pas.
> Mercide votre aide...
>
> "Paul Bacelar" a écrit :
>
>> Avez-vous pris en compte que les socket TCP font de la bufferisation à
>> l'émission.
>> --
>> Paul Bacelar
>> MVP VC++
>>
>> "zkoubidou" >> news:
>> > Bonjour,
>> > Voila mon problème: je récupère dans data ce que m'envoie un client que
>> > je
>> > charge dans "msg". Si le contenue de data vaut "IDEXP", je veux
>> > répondre
>> > "OK". Je charge la chaine "OK" dans "myWriteBuffer" et je fais
>> > stream.Write(myWriteBuffer, 0, myWriteBuffer.Length)...rienne remonte
>> > vers
>> > le
>> > client... Par contre si derrière je fais un stream.Write de "msg" (en
>> > commentaire dans l'exemple), dans le client j'obtiens une réponse avec
>> > les
>> > deux stream.Write.Dès que je remets en commentaire le stream.Write
>> > "msg"
>> > je
>> > n'ai plus de réponse...
>> > Je dois louper un truc mais je sais pas quoi.
>> > Merci d'avance pour votre aide.
>> >
>> > Int32 i;
>> > while((i = stream.Read(bytes, 0, bytes.Length))!=0)
>> > {
>> > data = System.Text.Encoding.ASCII.GetString(bytes, 0, i);
>> > data = data.ToUpper();
>> > Byte[] msg = System.Text.Encoding.ASCII.GetBytes(data);
>> > if(data.CompareTo("IDEXP")==1)
>> > {
>> > Byte[] myWriteBuffer = Encoding.ASCII.GetBytes("OK");
>> > stream.Write(myWriteBuffer, 0, myWriteBuffer.Length);
>> > //stream.Write(msg, 0, msg.Length);
>> > }
>> > else
>> > {
>> > Byte[] myWriteBufferError = Encoding.ASCII.GetBytes("ERROR");
>> > stream.Write(myWriteBufferError, 0, myWriteBufferError.Length);
>> > //stream.Write(msg, 0, msg.Length);
>> > }
>>
>>
>>





Poster une réponse
Anonyme