2010-03-29 10 views
5

Sto scrivendo un server TCP personalizzato e un client e dopo aver fatto un sacco di richieste (60.000 per l'esattezza) comincio a ottenere questo errore di 10048, che è should mean "l'indirizzo è già in uso."Errori di socket di 10048 sul client? Cause possibili?

L'errore continua a verificarsi, a meno che non sospenda il processo per 2 o 3 minuti come tale, quindi ricominci di nuovo, quindi inizia a visualizzare lo stesso errore poco dopo il riavvio. Se metto in pausa il processo client e riavvio il processo del server, ho ancora lo stesso errore sul client. Quindi è un problema lato cliente completo.

Questo non ha senso, tuttavia, questo errore si verifica solo in caso di associazione e questo errore si verifica sul client e non sul server. Quali potrebbero essere le possibili ragioni per questo?

un piccolo estratto della mia inizializzazione:

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

Inoltre, tutto il resto sembra funzionare bene (tra cui la quantità di tempo necessario per inviare avanti e indietro) e questo funziona perfettamente quando si utilizza 127.0.0.1 ma quando mettendolo su un altro computer LAN, comincio a ottenere l'errore 10048.

C'è qualcosa di sbagliato nel modo in cui lo inizializzo? Cos'altro potrebbe causare questo errore sul lato client?

risposta

9

Vedere http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspx SetSocketOption. Hai bisogno di DontLinger o ReuseAddr, o entrambi, non sono sicuro. Fondamentalmente i tuoi socket sono bloccati nello stato TIME_WAIT per un po 'di tempo dopo aver abbattuto la connessione TCP, una volta che ne hai abbastanza, non sarai in grado di creare alcuna nuova connessione client. Verifica questo con l'output del programma netstat -na.

Si può anche ridurre il tempo che rimane in presa stato TIME_WAIT cambiando nel Registro di sistema : http://msdn.microsoft.com/en-us/library/aa560610%28BTS.20%29.aspx di default è di 4 minuti, che probabilmente può essere ridotta a 1 o 2 minuti in modo sicuro, in particolare per il test.

Disclaimer: Io non sono un guru del TCP in nessun modo.

+0

ho aggiunto 'client.LingerState = new LingerOption (false, 0);' e utilizzando netstat, destra, ho un crap carico di connessioni in TIME_WAIT – Earlz

+0

Voglio dire, ho ancora un sacco di TIME_WAIT dopo aver aggiunto il bit 'LingerState' – Earlz

+0

Anche ReuseAddr non aiuta. – Earlz

0
+0

Se questa è la ragione, allora come funziona bene ogni volta che utilizzo localhost? – Earlz

+1

@Earlz: Potrebbe essere dovuto al fatto che le connessioni su 127.0.0.1 utilizzano una durata massima del segmento molto bassa (0?), In quanto non è possibile ottenere pacchetti vaganti. Non ero in grado di trovare nulla su questo da googling, ma avrebbe senso. Si potrebbe provare a utilizzare un IP di interfaccia e vedere se questo lo rende riproducibile sul computer locale, anche se potrebbe essere ottimizzato. Dai un'occhiata anche all'impostazione di TcpTimedWaitDelay su 30 secondi (http://msdn.microsoft.com/en-us/library/ms819739.aspx) sul server, se possibile –

Problemi correlati