Suchen Sie einen freien Port

8

Ich schreibe eine FTP-Server-Bibliothek (weil ich sie brauche und ich kann keine gute Lösung dafür finden) in C # und ich habe zwei Fragen:

  • Wie findet IPEndPoint einen freien Port, wenn ich zum Beispiel new IPEndPoint(IPAddress.Any, 0) mache?

  • Ist es möglich, einen freien Port aus einem Bereich (z. B. von 1023 bis 65535) zu finden, ohne die Methode GetActiveTcpConnections ? Weil es langsam ist - ich brauche einen schnelleren Weg, dies zu tun.

Alon Gubkin 16.03.2010, 17:47
quelle

1 Antwort

13

Sobald Sie einen nicht zugewiesenen Port (0) abhören, wird er vom Betriebssystem (genauer gesagt vom TCP / IP-Stack) zugewiesen. Da der Stack alle Ports verwaltet, kann er einen freien zuweisen.

Starten Sie einfach Ihre Verbindung und prüfen Sie dann den Port in der LocalEndpoint Eigenschaft, um es an den Client zu übergeben. Die TcpListener-Dokumentation enthält weitere Informationen hierzu.

Wenn Sie in einem Bereich einen freien finden müssen, müssen Sie nur den gesamten Bereich durchlaufen und versuchen, mit jedem zu beginnen. Wenn Sie erfolgreich sind, haben Sie einen freien Port gefunden, und Sie können Ihre Schleife verlassen. Wenn nicht, fahre einfach mit der Schleife fort. Dies ist der einzige zuverlässige Weg, um dies zu tun, da Sie sonst mit anderen Prozessen oder gar Threads in eine Race-Bedingung geraten, die beide den gleichen freien Port auswerten und der erste, der sie verwendet "gewinnt", während der andere Code nicht funktioniert kann den Port verwenden.

    
Lucero 16.03.2010 18:44
quelle

Tags und Links