Sto scrivendo un piccolo server Comet in C#, e per testarlo ho scritto un piccolo programma che apre un po 'di connessioni, scrive un piccolo testo per ognuna di esse e poi chiude ciascuna di loro:Creazione di 100.000 connessioni TCP usando .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);
}
sto usando Windows XP in questo momento, che assegna solo porte client dinamici dal 1025-5000 gamma, così ho aggiunto esplicito legame con le porte a partire da 30000. Questo mi ha portato da sotto 4000 connessioni a poco più di 16000, ma ora sto ottenendo la seguente eccezione su Socket.Connect:
"Un'operazione su una presa non potrebbe essere eseguito perché il sistema non disponeva di spazio sufficiente del buffer o perché una coda era piena 127.0.0.1:1999 "
Qualche idea? La modifica della dimensione del buffer di invio e ricezione non sembra fare alcuna differenza e sembra sempre essere la mia app client che si interrompe, mai il mio server. Mi rendo conto che finirò per esaurire le porte dei client prima di arrivare a 100.000 connessioni, ma mi piacerebbe comunque capire cosa sta succedendo un po 'meglio.
Penso di aver già esaurito le risorse di esaurimento del porto. Il binding esplicito è lì per gestire il numero limitato di porte assegnate dinamicamente e Socket.Disconnect libera il socket un po 'più veloce di un Socket.Close, quindi posso rieseguire il test senza attendere l'intervallo TIME_WAIT. – Daryl
Penso che ci sia anche un parametro limite di velocità, ma per questo non ho trovato un riferimento MSDN. L'altro sospetto che ho è il numero di buffer di rete disponibili. – tvanfosson
Non è necessario il binding esplicito per gestire il limite dinamico, è sufficiente regolare il limite come suggerito da tvanfosson. –