2010-05-04 10 views
4

J'avais l'habitude de penser qu'en utilisant SocketOptionName.ReuseAddress, je peux réutiliser un port qui est dans l'état TIME_WAIT. Mais j'ai essayé de l'expérimenter et il semble que cela n'a aucun effet.À quoi sert SocketOptionName.ReuseAddress?

Si je vérifie prises à l'aide netstat, et il montre la prise est en TIME_WAIT état et je diffusons immédiatement à nouveau le client, je reçois l'exception:

Une seule utilisation de chaque adresse de socket (protocole/réseau adresse/port) est normalement autorisé 172.16.16.16:12345

Je ne peux rien en tirer. S'il vous plaît pouvez-vous élaborer à quoi sert SocketOptionName.ReuseAddress?

Répondre

0

Pourquoi vous liez votre port client en premier lieu? Vous n'avez probablement pas besoin de le faire et si ce n'est pas le cas, il est préférable d'autoriser le système d'exploitation à sélectionner un port éphémère pour vous, et vous n'auriez pas ce problème en premier lieu. Deuxièmement, pourquoi pensez-vous que c'est une bonne idée de réutiliser un socket qui est TIME_WAIT; l'état existe pour une raison valable ...

Quant à savoir pourquoi il ne fonctionne pas pour vous, jetez un oeil sur le lien que je posté en réponse à cette même question: When binding a client TCP socket to a specific local port with Winsock, SO_REUSEADDR does not have any effect

+0

Merci pour la réponse. Dans ma vraie application, je ne lie pas le client à un port. Mais cette application a BEAUCOUP de connexion entrante donc elle peut manquer de ports libres (pas dans l'état TIME_WAIT). Pour simuler cette condition, j'ai explicitement fait cela. – Hemant

+0

Donc, votre problème actuel est que vous avez un serveur, avec des connexions entrantes et ils se retrouvent dans TIME_WAIT et vous préféreriez qu'ils ne le fassent pas. Il y a généralement de meilleurs moyens de résoudre ce problème particulier: 1) pouvez-vous déplacer la fermeture active vers le client? 2) si vous ne pouvez pas faire une clôture avortée et envoyer un «RST» plutôt que de faire une fermeture normale? etc. Néanmoins, au moins vous avez essayé cette route plutôt que de simplement décider de raccourcir la période 'TIME_WAIT' sur une base de machine ... Recherche ici, il y a beaucoup de questions à ce sujet. –