2012-05-20 25 views
7

Tengo una aplicación cliente, que utiliza una DLL no administrada para comunicarse con un servidor.¿Cómo cerrar (matar, liberar?) Un socket, que está en estado FIN_WAIT_2?

Todas las operaciones relacionadas con la red están presentes dentro de la dll no administrada. Después de varias operaciones con el servidor, el cliente se está quedando sin puertos TCP. Si comprobamos el estado de netwotk usando 'netstat', obtenemos el siguiente resultado:

... 
TCP 192.168.11.55:56048 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56049 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56050 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56051 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56052 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56053 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56054 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56055 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56056 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56057 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56058 192.168.10.27:5000  FIN_WAIT_2 
TCP 192.168.11.55:56059 192.168.10.28:5000  FIN_WAIT_2 
TCP 192.168.11.55:56060 192.168.10.27:5000  FIN_WAIT_2 
... 

Los puertos son liberados sólo después de que el cliente se cierra.

Si ejecuto el proyecto VS en el modo de depuración, nunca se agota los puertos. Pero, mientras se ejecuta en modo de lanzamiento, está sucediendo.

Y no tengo acceso ni al servidor ni a la fuente del cliente.

¿Cómo liberar o matar esos puertos que están en estado FIN_WAIT_2?

Respuesta

7

Cuando un socket está en FIN_WAIT_2, el socket local se cerró y está esperando que el socket remoto envíe su solicitud de cierre. Si esta solicitud de cierre nunca llega, el socket permanecerá en el estado FIN_WAIT_2 por un tiempo.

La razón detrás de esto es que si la solicitud de cierre de la ubicación remota se retrasaría y llegaría después de que otra aplicación reutilice el socket, esa nueva conexión se cerraría instantáneamente.

Puede cambiar el tiempo de espera si lo desea, pero al final, el dll no administrado no ha implementado por completo la secuencia de apagado del TCP. Para obtener más información, véase el socket del lado

http://answers.microsoft.com/en-us/windows/forum/windows_7-networking/how-to-close-finwait2-connections-except-reboot/ba2fed9f-8b61-4b71-ab5b-d39dc9a387e3

+0

Configurar el tiempo de espera al valor mínimo ayudó, pero no mucho. Finalmente, pudimos resolver el problema configurando el parámetro TCP_NODELAY en el lado del cliente. Gracias. – ulughbekula

+0

¿qué pasa con mac OS X? –

1

El servidor leerá 0 bytes cuando se apaga/cierra el socket del cliente.
En este punto, debe apagar/cerrar el socket del servidor. Su conexión se mostrará como TIME_WAIT con PID0 y, finalmente, desaparecerá.

Creo que es tan bueno como se pone.

Cuestiones relacionadas