J'ai un problème, j'ai développé un wrapper Client et Serveur pour mon usage personnel, mais malheureusement, en raison d'une connaissance insuffisante en programmation réseau, j'ai des problèmes TIME_WAIT lors de la connexion sur le client . Mon client essaie de faire plusieurs connexions au même hôte dans un court laps de temps maintenant, j'ai découvert que la raison principale de cela est parce que j'essaye de réutiliser le socket et il passe à l'état TIME_WAIT parce que je ferme le connexion sans arrêt gracieux. Je voudrais savoir le modèle correct pour fermer la connexion en utilisant des prises .NET au cas où j'utilise des API Async intensivement ie des fonctions comme ConnectAsync, AcceptAsync, SendAsync, ReceiveAsync, DisconnectAsync (DisconnectAsync - réutilise socket)Prévention de TIME_WAIT en utilisant l'API .NET 'Async'
Répondre
Vous pouvez utilisez SO_REUSEADDR sur le socket pour contourner cela. Voir Socket.SetSocketOption pour plus de détails, c'est l'option ReuseAddress
que vous devez définir. D'ailleurs, vous ne voulez pas vraiment dire réutiliser le socket, n'est-ce pas? Une fois que vous obtenez une erreur, vous devez la fermer et en ouvrir une nouvelle.
L'utilisation de SO_REUSEADDR n'est pas une option http://www.unixguide.net/network/socketfaq/4.5.shtml – Lu4
http://msdn.microsoft.com/en-us/library/ms740621(VS.85).aspx – Lu4
@ Lu4 Pourquoi? Je ne vois rien dans l'un ou l'autre des liens disant que cela devrait être évité, mais seulement que les implications doivent être comprises. Par exemple, c'est crucial si vous voulez implémenter des connexions TCP P2P derrière un NAT. – Basic
J'ai découvert qu'il est impossible d'empêcher TIME_WAIT. Le serveur ou le client aura le problème de toute façon, en fonction uniquement de qui initie une fermeture de la connexion en premier. Si c'est le client qui ferme la connexion, il n'y aura pas TIME_WAIT sur le serveur. Si c'est le serveur qui se ferme en premier, il n'y aura pas de TIME_WAIT sur le client. Donc la seule option qui reste à faire est d'utiliser SO_REUSEADDR, mais dans ce cas it is still impossible to use the reused address for contacting previously disconnected host
Excellente observation! –
Bit d'un ancien thread ... mais voir cela, car cela fonctionne pour moi en empêchant TIME_WAIT: http://stackoverflow.com/questions/40785598/to-close-the-socket-dont-close-the-socket- euhmm – cogumel0
Si vous utilisez le socket tcp, il a des valeurs par défaut dans windows voir http://support.microsoft.com/kb/158474 pour plus de détails, et Si vos clients ne sont pas des clients légers, je vous suggère d'utiliser WCF plutôt que tcp. –