Ich schreibe einen kleinen Comet-Server in C#, und um es zu testen, habe ich ein kleines Programm geschrieben, das eine Reihe von Verbindungen öffnet, schreibt einen kleinen Text zu jedem von ihnen und schließt dann jeden das nahm mich unter 4000Erstellen von 100.000 TCP-Verbindungen mit .NET
int basePort = 30000;
IPAddress localAddress = new IPAddress(new byte[] { 127, 0, 0, 1 });
List<Socket> sockets = new List<Socket>();
for(int i = 0; i < 20000; i++) {
Socket s = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
s.Bind(new IPEndPoint(localAddress, basePort + i));
s.Connect("localhost", 1999);
sockets.Add(s);
}
string message = "hello";
byte[] messageData = Encoding.ASCII.GetBytes(message);
foreach(Socket s in sockets) {
s.Send(messageData);
}
foreach(Socket s in sockets) {
s.Disconnect(false);
}
ich verwende Windows XP zur Zeit, welche Ports dynamische Client aus dem 1025-5000 Bereich zuordnet nur, so habe ich beginnen explizite Bindung an Ports an 30000. hinzugefügt: von ihnen Verbindungen zu etwas mehr als 16000, aber jetzt bekomme ich die folgende Ausnahme auf Socket.Connect:
"Eine Operation auf einem Socket konnte nicht sein durchgeführt, weil das System nicht genügend Pufferkapazität hatte oder weil eine Warteschlange voll war 127.0.0.1:1999 "
Irgendwelche Gedanken? Das Ändern der Sende- und Empfangspuffergröße scheint keinen Unterschied zu machen, und es scheint immer, dass meine Client-Anwendung bricht, niemals mein Server. Mir ist klar, dass mir die Client-Ports ausgehen werden, bevor ich 100.000 Verbindungen bekomme, aber ich würde trotzdem gerne verstehen, was hier besser läuft.
Ich denke, ich habe die Port Erschöpfung Sachen bereits behandelt. Die explizite Bindung ist da, um mit der begrenzten Anzahl von dynamisch zugewiesenen Ports fertig zu werden, und die Socket.Disconnect gibt den Socket etwas schneller frei als ein Socket.Close, sodass ich meinen Test erneut ausführen kann, ohne auf das TIME_WAIT-Intervall zu warten. – Daryl
Ich denke, dass es auch einen Rate-Limit-Parameter gibt, aber ich habe keine MSDN-Referenz dafür gefunden. Der andere Verdacht, den ich habe, ist die Anzahl der verfügbaren Netzwerkpuffer. – tvanfosson
Sie brauchen keine explizite Bindung, um mit dem dynamischen Limit umzugehen, Sie müssen nur das Limit anpassen, wie tvanfosson vorgeschlagen hat. –