Comment trouver un port TCP libre avec NetTcpBinding (WCF) (afin qu'un serveur puisse s'y connecter)

StackOverflow https://stackoverflow.com/questions/1803065

Question

Trouver le prochain port TCP dans .Net indique comment faites cela en .net brut, mais pas comment y parvenir en toute sécurité avec WCF.

Dans mes tests unitaires, je dois utiliser NetTcpBinding, je ne souhaite pas coder en dur le port utilisé .

Par conséquent, comment puis-je obtenir que NetTcpBinding choisisse automatiquement un port libre lorsqu'il est utilisé dans mon ServiceHost?

Comment puis-je l'obtenir pour me dire le port (ou l'adresse complète du noeud final) qu'il a choisi?

Ou comment puis-je utiliser .NET pour trouver quelques ports sur lesquels un serveur peut se connecter?

Etant donné que ma prime n'a conduit à aucune nouvelle réponse, je pense que nous pouvons supposer qu'il n'y a pas de bonne réponse.

Était-ce utile?

La solution 6

À l'heure actuelle, je pense que ce n'est pas possible, merci à tous ceux qui ont fourni un tour de table.

Autres conseils

Vous n'avez pas besoin de lancer votre propre logique de recherche de port - Windows choisira un port libre si vous le spécifiez comme 0. Vous pourrez alors déterminer le port attribué en interrogeant les distributeurs, comme suit:

// Specify port 0, this will cause Windows to choose a free port
var baseUri = new Uri("net.tcp://" + Dns.GetHostEntry("").HostName + ":0");
host = new WebServiceHost(typeof(MyService));
var endPoint = host.AddServiceEndpoint(typeof(IMyService), new NetTcpBinding(), baseUri);

 // Tell WCF to actually bind to a free port instead of 0
 endPoint.ListenUriMode = ListenUriMode.Unique;

 host.Open();

 // Now that the host has bound to a specific port, we can find out which one it chose
 return host.ChannelDispatchers.First().Listener.Uri;

Définissez le port à zéro. Cela permet au système d'exploitation de choisir un port disponible pour vous. Si vous devez déterminer quel port a été utilisé, vous pouvez l'interroger à partir du socket une fois qu'il a été lié localement.

Voici ce que je fais: commencer par un port aléatoire dans la plage 1025-2000 (plage choisie arbitrairement). J'essaie de le lier et s'il échoue, j'attrape l'exception. Ensuite, je monte un port ( port = port% 2000 + 1025 ) jusqu'à ce que je termine. Si aucun port n’est lié, j’abandonne l’échec du test.

4 ans plus tard .. À ce jour, nous avons une solution: définir ListenUriMode sur Unique , comme indiqué dans MSDN

Voici un petit exemple de configuration de noeud final

<endpoint address="service"
          binding="netTcpBinding"
          contract="Iservice"
          name="TcpBinding"
          bindingConfiguration="netTcpBindingNoSec"
          listenUriMode="Unique"
          />

Et maintenant, le problème suivant: si le port est dynamique, comment les clients peuvent-ils le savoir? Comme indiqué dans CETTE RÉPONSE , vous pouvez utiliser DÉCOUVERTE WCF : nécessite une petite configuration sur le serveur et côté client mais cela fonctionne bien (avec le seul problème que cela prend quelques secondes pour l’obtenir, par défaut 20 secondes mais je n’ai aucun problème à le forcer à 5)

lorsque vous utilisez un port haut aléatoire, vous pouvez générer des collisions avec d'autres processus serveur souhaitant démarrer après votre programme. utilisez simplement zéro comme numéro de port et laissez l’OS se préoccuper des réservations (/ etc / services sous unix, ne savez pas comment windows le gère).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top