Parece que usar socket.Close() para un socket tcp, no cierra completamente el socket. En el siguiente ejemplo, intento conectarme a example.com en el puerto 9999, que no está abierto, y luego de un corto tiempo de espera, intento cerrar el socket.Socket.Close realmente no cierra socket tcp? (C#)
for (int i = 0; i < 200; i++)
{
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
sock.LingerState = new LingerOption(false, 0);
sock.BeginConnect("www.example.com", 9999, OnSocketConnected, sock);
System.Threading.Thread.Sleep(50);
sock.Close();
}
Pero cuando tomo un vistazo a netstat después del bucle se completa, me parece que hay muchas tomas entreabiertas:
TCP israel-xp:6506 www.example.com:9999 SYN_SENT
TCP israel-xp:6507 www.example.com:9999 SYN_SENT
TCP israel-xp:6508 www.example.com:9999 SYN_SENT
TCP israel-xp:6509 www.example.com:9999 SYN_SENT
EDIT . Ok, faltaba algo de contexto. Estoy usando beginconnect porque espero que la conexión del socket falle (9999 no se abre), y en mi código real, llamo al socket.Close() una vez que se establece un temporizador. En OnSocketConnected llamo a EndConnect, que arroja una excepción (tratando de llamar a un método de un objeto eliminado). Mi objetivo es tener un tiempo de espera corto para la etapa de conexión de socket.
¿Alguna pista de lo que estoy haciendo mal? Gracias!
que tenga sentido, pero que no establezca que la demora sea falsa, ¿debería resolverlo? – r0u1i
oh, la demora no hace esto. Entonces, no hay realmente una manera de hacer que Windows termine el socket. – r0u1i
de forma predeterminada se colocará en el estado FIN_WAIT durante 4 minutos antes de que Windows realmente lo cierre. Aún más interesante es que si vuelve a abrir la otra conexión con el mismo destino/puerto, Windows reutilizará las conexiones en FIN_WAIT que coincidan. – Jay