Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pb de causerie socket client/serveur

4 réponses
Avatar
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);
}

4 réponses

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

"zkoubidou" wrote in message
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);
}


Avatar
zkoubidou
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" wrote in message
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);
> }





Avatar
Simon Mourier [SoftFluent]
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" a écrit dans le message de
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" wrote in message
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);
> }







Avatar
zkoubidou
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" a écrit dans le message de
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" wrote in message
>> 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);
>> > }
>>
>>
>>