2010-03-29 8 views
5

Ich schreibe einen benutzerdefinierten TCP-Server und Client und auf eine Tonne Anfragen (60.000 um genau zu sein) Ich beginne, diesen Socket-Fehler von 10048 zu bekommen, die should mean "die Adresse wird bereits verwendet."Socket-Fehler von 10048 auf dem Client? Mögliche Ursachen?

Der Fehler tritt immer dann auf, wenn ich den Vorgang nicht länger als 2 oder 3 Minuten pausiere und dann erneut beginne und dann kurz nach dem Neustart denselben Fehler anzeigt. Wenn ich den Clientprozess pausiere und den Serverprozess neu starte, bekomme ich immer noch den gleichen Fehler auf dem Client. Es ist also ein komplettes Client-seitiges Problem.

Dies ergibt keinen Sinn, dieser Fehler tritt normalerweise nur beim Binden auf, und dieser Fehler tritt auf dem Client und nicht auf dem Server auf. Was könnten die möglichen Gründe dafür sein?

Ein kleiner Auszug meiner Initialisierung:

TcpClient client = new TcpClient(); 
client.Connect("XXXXX -- some ip", 25000); 
client.NoDelay = true; 
NetworkStream clientStream = client.GetStream(); 

Auch scheint alles andere in Ordnung (einschließlich der Höhe der Zeit hin und her dauert es senden) zu arbeiten und dies funktioniert perfekt, wenn 127.0.0.1 verwenden, aber wenn Auf einen anderen LAN-Computer setzend, beginne ich den Fehler 10048 zu bekommen.

Ist etwas falsch mit, wie ich es initialisiere? Was könnte sonst diesen Fehler auf der Clientseite verursachen?

Antwort

9

Siehe http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspx SetSocketOption. Du brauchst DontLinger oder ReuseAddr oder beides, da bin ich mir nicht sicher. Grundsätzlich stecken Ihre Sockets für eine Weile im TIME_WAIT-Zustand, nachdem Sie die TCP-Verbindung abgebaut haben. Sobald Sie genug von ihnen haben, können Sie keine neuen Client-Verbindungen mehr erstellen. Überprüfen Sie dies mit der Programmausgabe netstat -na.

können Sie reduzieren auch die Zeit, die Buchse in TIME_WAIT-Zustand bleiben, indem sie es in dem Registry zu ändern: http://msdn.microsoft.com/en-us/library/aa560610%28BTS.20%29.aspx Standard 4 Minuten sind die wahrscheinlich sicher zu 1 oder 2 Minuten reduziert werden kann, insbesondere für die Prüfung.

Haftungsausschluss: Ich bin auf keinen Fall ein TCP-Guru.

+0

Ich habe 'client.LingerState = new LingerOption (false, 0);' und mit netstat, der rechten Seite, habe ich ein Mist Belastung von Verbindungen in TIME_WAIT – Earlz

+0

Ich meine, ich habe immer noch eine Menge TIME_WAIT nach dem Hinzufügen 'LingerState' Bit – Earlz

+0

ReuseAddr hilft auch nicht. – Earlz

0
+0

Wenn dies der Grund ist, wie funktioniert es dann, wenn ich localhost benutze? – Earlz

+1

@Earlz: Es kann sein, dass Verbindungen auf 127.0.0.1 eine sehr niedrige (0?) Maximale Segmentlebensdauer verwenden, da wir wirklich keine wandernden Pakete bekommen können. Ich konnte nichts dazu finden, indem ich google, aber es würde Sinn machen. Sie könnten versuchen, eine Interface-IP zu verwenden und zu überprüfen, ob dies auf dem lokalen Rechner reproduzierbar ist - obwohl dies auch optimiert werden kann. Schauen Sie auch auf TcpTimedWaitDelay auf dem Server auf 30 Sekunden (http://msdn.microsoft.com/en-us/library/ms819739.aspx), wenn dies möglich ist –

Verwandte Themen