2009-09-21 5 views
0

J'essaye de faire ce qui suit: écouter sur un port pour les connexions de bouclage seulement, puis commencer à écouter sur n'importe quelle adresse IP. Voici le code:TcpListener problème - re-liaison au même port avec différentes adresses locales

TcpListener l1 = new TcpListener(new IPEndPoint(IPAddress.Loopback, 12345)); 
l1.Start(); 
Socket s = l1.AcceptSocket(); 
Console.ReadKey(); 
//s.Close(); 
l1.Stop(); 
TcpListener l2 = new TcpListener(new IPEndPoint(IPAddress.Any, 12345)); 
l2.Start(); 
l2.AcceptSocket(); 
Console.ReadKey(); 

Le problème est que si un client se connecte tout en écoutant sur l'adresse Loopback (l1), aucun autre client peut se connecter à l'adresse de bouclage lorsque le deuxième écouteur (L2) commence à écouter . pourquoi donc?

Une autre chose que j'ai remarquée est que si je ferme tous les clients qui se sont connectés à l1 (la ligne remarquée), alors l2 accepte les connexions de bouclage.

Des idées?

Répondre

1

La méthode Stop() ne ferme aucune connexion. Donc, vous feriez mieux de lier à toute interface, puis traiter les données en fonction de l'adresse IP de connexion.

+0

Je voudrais éviter d'écouter sur tout interface et discriminer les connexions. J'ai besoin des deux étapes: Loopback puis Any. Pourquoi TcpListener.Stop() sur le premier écouteur n'autorise-t-il pas le second écouteur à accepter les connexions de bouclage si un client est connecté au premier écouteur? –

+0

Je ne vois pas ce que vous voulez dire. Comment discrimines-tu quelque chose? Si vous devez gérer plusieurs connexions à la fois, pensez à regarder certains composants prêts à l'emploi comme Indy Sockets. –

+0

Ce n'est pas le problème. Je pose une question technique, une question de Windows interne sur le comportement des prises d'écoute. Écoute sur l'interface Loopback, fermeture, puis écoute sur Toute interface. –

0

Le problème n'a rien à voir avec la connexion de clients, mais uniquement avec des sockets de liaison pour écouter la plage/le port IPAddress spécifié. L'écoute de "Any" inclut l'écoute sur "Loopback", et comme quelque chose est encore en écoute sur "Loopback", la tentative d'écoute sur "Any" échoue.

L'appel de fermeture commenté est en fait exactement ce qui est nécessaire dans ce scénario. Cela arrête d'écouter de nouvelles connexions, mais ne ferme pas la connexion déjà acceptée.

Toutefois, ce comportement peut être ajusté. Voir pour plus de détails this MSDN page:

(Answered pour la postérité comme sans doute cette réponse vient beaucoup trop tard à l'op.)

Questions connexes