2010-03-29 27 views
5

Escribo un cliente y servidor TCP personalizado y al hacer un montón de solicitudes (60,000 para ser exactos) empiezo a obtener este error de socket de 10048, que should mean "la dirección ya está en uso".¿Errores de socket de 10048 en el cliente? ¿Posibles causas?

El error continúa ocurriendo a menos que detenga el proceso durante 2 o 3 minutos y luego comience de nuevo, y luego comienza a aparecer el mismo error un momento después de haberlo reiniciado. Si detengo el proceso del cliente y reinicio el proceso del servidor, sigo recibiendo el mismo error en el cliente. Entonces es un problema completo del lado del cliente.

Esto no tiene sentido, sin embargo, este error solo ocurre cuando se vincula y este error ocurre en el cliente y no en el servidor. ¿Cuáles podrían ser las posibles razones para ello?

Un pequeño extracto de mi inicialización:

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

Además, todo el mundo parece estar funcionando bien (incluyendo la cantidad de tiempo que se tarda en enviar un lado a otro) y esto funciona perfectamente cuando se utiliza 127.0.0.1 pero cuando poniéndolo en otra computadora LAN, empiezo a obtener el error 10048.

¿Hay algún problema con la inicialización? ¿Qué otra cosa podría causar este error en el lado del cliente?

Respuesta

9

Ver http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspx SetSocketOption. Necesitas DontLinger o ReuseAddr, o ambos, no estoy seguro. Básicamente, sus sockets están atrapados en el estado TIME_WAIT durante un tiempo después de que derriba la conexión TCP, una vez que obtiene suficiente de ellos, no podrá crear nuevas conexiones de cliente. Verifique esto con la salida del programa netstat -na.

También puede reducir el tiempo que toma permanece en estado TIME_WAIT cambiándolo en el registro : http://msdn.microsoft.com/en-us/library/aa560610%28BTS.20%29.aspx por defecto es de 4 minutos que probablemente pueden reducirse a 1 o 2 minutos con seguridad, especialmente para la prueba.

Descargo de responsabilidad: No soy un gurú de TCP de ninguna manera.

+0

añadí 'client.LingerState = LingerOption nueva (falso, 0); y el uso de' netstat, a la derecha, que tienen una carga de basura de conexiones en TIME_WAIT – Earlz

+0

Quiero decir, todavía tengo mucho TIME_WAIT después de agregar el bit 'LingerState' – Earlz

+0

ReuseAddr tampoco ayuda. – Earlz

0
+0

Si este es el motivo, ¿cómo funciona bien cada vez que uso localhost? – Earlz

+1

@Earlz: Puede ser porque las conexiones en 127.0.0.1 usan una vida útil de segmento máxima muy baja (0?), Ya que realmente no podemos obtener paquetes itinerantes. No pude encontrar nada en esto buscando en Google, pero tendría sentido. Podría tratar de usar una IP de interfaz y ver si esto la hace reproducible en la máquina local, aunque esto también puede optimizarse. También eche un vistazo a la configuración de TcpTimedWaitDelay en 30 segundos (http://msdn.microsoft.com/en-us/library/ms819739.aspx) en el servidor, si esto es posible –

Cuestiones relacionadas