J'envoie une grande quantité de données en une fois entre un C# écrit par le client et le serveur. Cela fonctionne bien quand je cours le client et le serveur sur ma machine locale mais quand je mets le serveur sur un ordinateur distant sur Internet il semble laisser tomber des données.Gestion des paquets TCP abandonnés en C#
J'envoie 20000 chaînes en utilisant la méthode socket.Send() et je les reçois en utilisant une boucle qui fait socket.Receive(). Chaque chaîne est délimitée par des caractères uniques que j'utilise pour compter le nombre reçu (c'est le protocole si vous voulez). Le protocole est prouvé, car même avec des messages fragmentés, chaque chaîne est correctement comptée. Sur ma machine locale, je reçois tous 20000, sur Internet, je reçois quelque chose entre 17000-20000. Il semble être pire la connexion plus lente que l'ordinateur distant a. Pour ajouter à la confusion, activer Wireshark semble réduire le nombre de messages abandonnés.
Tout d'abord, quelle en est la cause? Est-ce un problème TCP/IP ou quelque chose de mal avec mon code?
Deuxièmement, comment puis-je contourner cela? Recevoir toutes les 20000 chaînes est essentiel.
Socket Code réception:
private static readonly Encoding encoding = new ASCIIEncoding();
///...
while (socket.Connected)
{
byte[] recvBuffer = new byte[1024];
int bytesRead = 0;
try
{
bytesRead = socket.Receive(recvBuffer);
}
catch (SocketException e)
{
if (! socket.Connected)
{
return;
}
}
string input = encoding.GetString(recvBuffer, 0, bytesRead);
CountStringsIn(input);
}
Socket Code envoi:
private static readonly Encoding encoding = new ASCIIEncoding();
//...
socket.Send(encoding.GetBytes(string));
Il semble que vous avalez SocketExceptions ici aussi longtemps que la prise est connectée. Vous devriez au moins toujours imprimer l'exception si elle n'est pas renvoyée (et nettoyer la socket dans un bloc finally). Essayez d'ajouter cela et voyez s'il lance sans fermer le Socket. –
Merci - aucune exception n'a été levée. Je vois des pauses (ou des retards dans la transmission) sur la réception lorsque je cours sur Internet - je pense que cela doit être l'effet de l'algorithme de Nagles comme vous l'avez mentionné. L'autre chose intéressante est le nombre moyen d'octets reçus par appel à recevoir() est beaucoup plus élevé lorsqu'il est exécuté sur Internet. – Nosrama
En outre, si je désactive l'algorithme de Nagles, je laisse tomber beaucoup plus de messages. Je suppose que c'est parce que j'envoie plus de paquets bruts car Nagles ne les agrège pas en paquets plus gros et donc les chances que certains soient abandonnés augmentent. – Nosrama