Comment s’assurer que NetworkStream envoie des données immédiatement sans fermer le Stream ou TcpClient?

J’ai un extrait de code très simple qui tente d’envoyer des données via TcpClient et son NetworkStream associé.

 var client = new TcpClient("xxx.xxx.xxx.xxx", 1234); NetworkStream stream = client.GetStream(); byte[] buffer = Encoding.ASCII.GetBytes(str); stream.Write(buffer, 0, buffer.Length); 

J’ai constaté que les données ne sont généralement pas envoyées immédiatement après stream.Write() . Si j’ajoute client.Close() ou stream.Close() données seront envoyées. Cependant, dans mon cas, j’essaie d’attendre que le serveur envoie un message ACK afin de pouvoir réutiliser le NetworkStream origine sans fermer ni le TcpClient ni le NetworkStream . Comment cela peut-il être fait?

Définissez TcpClient.NoDelay sur true afin que l’algorithme de Nagle ne soit pas utilisé.

De la documentation MSDN Library:

Lorsque NoDelay a la valeur false , un client TcpClient n’envoie pas de paquet sur le réseau tant qu’il n’a pas collecté une quantité importante de données sortantes. En raison de la surcharge du segment TCP, l’envoi de petites quantités de données est inefficace. Cependant, il existe des situations dans lesquelles vous devez envoyer de très petites quantités de données ou attendre des réponses immédiates de chaque paquet envoyé. Votre décision doit peser l’importance relative de l’efficacité du réseau par rapport aux exigences des applications.