Il semble que l'utilisation de socket.Close() pour un socket tcp, ne ferme pas complètement le socket. Dans l'exemple suivant, j'essaie de me connecter à example.com au port 9999, qui n'est pas ouvert, et après un court délai, j'essaye de fermer le socket.Socket.Close ne ferme pas vraiment tcp socket? (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();
}
Mais quand je regarde à netstat après la boucle est terminée, je trouve qu'il ya beaucoup de prises entrouvertes:
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, un peu de contexte manquait. J'utilise beginconnect parce que je m'attends à ce que la connexion socket échoue (9999 n'est pas ouvert), et dans mon code réel, j'appelle le socket.Fermeture() une fois qu'une minuterie est définie. Sur OnSocketConnected, j'appelle EndConnect, qui déclenche une exception (en essayant d'appeler une méthode d'un objet éliminé). Mon but est d'avoir un court délai pour l'étape de connexion de socket.
Une idée de ce que je fais mal? Merci!
qui a du sens, mais ne fixe pas à false devrait le résoudre? – r0u1i
oh, s'attarder ne fait pas ça. Donc, il n'y a pas vraiment de moyen de faire en sorte que Windows termine le socket. – r0u1i
par défaut, il restera dans l'état FIN_WAIT pendant 4 minutes avant que Windows ne le ferme vraiment. Plus intéressant encore, si vous rouvrez une autre connexion à la même destination/port, Windows va réutiliser les connexions dans FIN_WAIT qui correspondent. – Jay