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.