2010-03-16 5 views
8

J'écris une bibliothèque de serveur FTP (parce que je dois et je ne peux pas trouver de bonnes solutions pour cela) en C# et j'ai deux questions:Trouver un port libre

  • COMMEnT IPEndPoint trouver un port gratuit quand je fais new IPEndPoint(IPAddress.Any, 0), par exemple?

  • Est-il possible de trouver un port libre d'une plage (par exemple 1023-65535), sans la méthode GetActiveTcpConnections? Parce que c'est lent - j'ai besoin d'un moyen plus rapide de le faire.

+1

duplication possible de [Trouver le port TCP suivant dans .Net] (http://stackoverflow.com/questions/138043/find-the-next-tcp-port-in-net) –

Répondre

13

Dès que vous commencez à écouter sur un port non affecté (0), il sera attribué par le système d'exploitation (ou, plus précisément, par la pile TCP/IP). Puisque la pile gère tous les ports, elle peut en attribuer une libre.

Commencez simplement à écouter sur votre connexion, puis vérifiez le port dans la propriété LocalEndpoint pour le transmettre au client. Le TcpListener documentation contient plus d'informations à ce sujet.

Si vous avez besoin de trouver un modèle gratuit dans une gamme, il vous suffit de parcourir la plage complète et d'essayer de commencer à écouter sur chacun d'entre eux. Si vous réussissez, vous avez trouvé un port gratuit et vous pouvez quitter votre boucle; sinon, continuez simplement avec la boucle. C'est la seule façon fiable de le faire car sinon vous pouvez rencontrer une condition de concurrence avec d'autres processus ou même des threads qui évaluent le même port libre et le premier à l'utiliser "gagne", tandis que l'autre code ne sera pas capable d'utiliser le port.