Wie kann ich in C # zuerst überprüfen, ob ein bestimmter Port auf meinem Computer frei ist, um einen TcpClient zu verwenden oder allgemein eine Verbindung zu einem Socket herzustellen?
Weitere Informationen: Dies ist der Code, den ich verwende:
TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);
Antworten:
Da Sie a verwenden
TcpClient
, bedeutet dies, dass Sie offene TCP-Ports überprüfen. Im System.Net.NetworkInformation- Namespace sind viele gute Objekte verfügbar .Verwenden Sie das
IPGlobalProperties
Objekt, um zu einem Array vonTcpConnectionInformation
Objekten zu gelangen, die Sie dann nach Endpunkt-IP und Port abfragen können.quelle
netstat -a -b
. Beachten Sie, dassLISTENING
in der keine Verbindungen vorhanden sindGetActiveTcpConnections()
. Sie sollten auch eincheckenSystem.Net.IPEndPoints[]
zurückgegeben vonipGlobalProperties.GetActiveTcpListeners();
Du bist am falschen Ende der Intertube. Es ist der Server, auf dem nur ein bestimmter Port geöffnet sein kann. Etwas Code:
Schlägt fehl mit:
quelle
Wenn Sie eine TCP-Verbindung einrichten, muss das 4-Tupel (Quell-IP, Quell-Port, Ziel-IP, Ziel-Port) eindeutig sein - um sicherzustellen, dass Pakete an den richtigen Ort geliefert werden.
Auf der Serverseite gibt es eine weitere Einschränkung, dass nur ein Serverprogramm an eine eingehende Portnummer gebunden werden kann (unter der Annahme einer IP-Adresse; Multi-NIC-Server haben andere Befugnisse, aber wir müssen sie hier nicht diskutieren).
Am Serverende haben Sie also:
Auf der Client-Seite ist es normalerweise etwas einfacher:
Es ist nicht erforderlich, dass die Ziel-IP / der Ziel-Port eindeutig ist, da dies dazu führen würde, dass jeweils nur eine Person Google verwenden kann, und dies würde ihr Geschäftsmodell ziemlich gut zerstören.
Dies bedeutet, dass Sie sogar wundersame Dinge wie FTP mit mehreren Sitzungen ausführen können, da Sie mehrere Sitzungen eingerichtet haben, bei denen der einzige Unterschied Ihr Quellport ist, sodass Sie Chunks parallel herunterladen können. Torrents unterscheiden sich ein wenig darin, dass das Ziel jeder Sitzung normalerweise unterschiedlich ist.
Und nach all dem Waffeln (sorry) lautet die Antwort auf Ihre spezielle Frage, dass Sie keinen freien Port angeben müssen. Wenn Sie mit einem Anruf, der Ihren Quellport nicht angibt, eine Verbindung zu einem Server herstellen, wird mit ziemlicher Sicherheit Null unter der Decke verwendet, und das System gibt Ihnen eine nicht verwendete.
quelle
Sie haben falsch verstanden, was hier passiert.
Die TcpClient (...) -Parameter beziehen sich auf die Server-IP und den Server-Port, zu dem Sie eine Verbindung herstellen möchten.
Der TcpClient wählt einen vorübergehenden lokalen Port aus dem verfügbaren Pool aus, um mit dem Server zu kommunizieren. Es ist nicht erforderlich, die Verfügbarkeit des lokalen Ports zu überprüfen, da dieser automatisch von der Winsock-Schicht verarbeitet wird.
Falls Sie mit dem obigen Codefragment keine Verbindung zum Server herstellen können, kann das Problem eines oder mehrere von mehreren sein. (dh Server-IP und / oder Port sind falsch, Remote-Server nicht verfügbar usw.)
quelle
Danke für diesen Tipp. Ich brauchte die gleiche Funktionalität, aber auf der Serverseite, um zu überprüfen, ob ein Port verwendet wurde, und habe ihn in diesen Code geändert.
quelle
-anb
) und zeigt ohne Parameter die Fremdverbindung sowie den Status an.danke für die antwort jro. Ich musste es für meinen Gebrauch optimieren. Ich musste überprüfen, ob ein Port abgehört wurde und nicht unbedingt aktiv war. Dafür habe ich ersetzt
mit
Ich habe das Array der Endpunkte wiederholt und überprüft, ob mein Portwert nicht gefunden wurde.
quelle
quelle
netstat! Dies ist ein Netzwerkbefehlszeilenprogramm, das mit Windows geliefert wird. Es zeigt alle aktuell eingerichteten Verbindungen und alle Ports an, die gerade abgehört werden. Sie können dieses Programm verwenden, um zu überprüfen, aber wenn Sie dies aus dem Code heraus tun möchten, schauen Sie in den System.Net.NetworkInformation-Namespace? Es ist ein neuer Namespace ab 2.0. Da sind ein paar Leckereien. Wenn Sie jedoch die gleichen Informationen erhalten möchten, die über den Befehl netstat verfügbar sind, müssen Sie P / Invoke ausführen ...
Update: System.Net.NetworkInformation
Dieser Namespace enthält eine Reihe von Klassen, mit denen Sie Dinge über das Netzwerk herausfinden können.
Ich konnte dieses alte Stück Code nicht finden, aber ich denke, Sie können selbst etwas Ähnliches schreiben. Ein guter Anfang ist das Auschecken der IP Helper API . Google MSDN für die GetTcpTable WINAPI-Funktion und verwenden Sie P / Invoke, um aufzuzählen, bis Sie die benötigten Informationen haben.
quelle
Wenn ich mich nicht sehr irre, können Sie System.Network.whatever verwenden, um dies zu überprüfen.
Dies führt jedoch immer zu einer Rennbedingung.
Die kanonische Art der Überprüfung besteht darin, diesen Port abzuhören. Wenn Sie eine Fehlermeldung erhalten, war dieser Port nicht geöffnet.
Ich denke, dies ist ein Teil dessen, warum bind () und listen () zwei separate Systemaufrufe sind.
quelle
Du sagst
Sie können jedoch jederzeit eine Verbindung zu einem Port herstellen, während andere ihn verwenden, wenn dort etwas zuhört. Andernfalls wäre http-Port 80 ein Chaos.
Wenn dein
scheitert, dann hört dort nichts zu. Andernfalls wird eine Verbindung hergestellt, auch wenn auf einem anderen Computer / einer anderen Anwendung ein Socket für diese IP-Adresse und diesen Port geöffnet ist.
quelle
ipGlobalProperties.GetActiveTcpConnections()
gibt keine Verbindungen im Listen-Status zurück.Der Port kann zum Abhören verwendet werden, aber wenn niemand daran angeschlossen ist, funktioniert die oben beschriebene Methode nicht.
quelle
Von den verfügbaren Häfen würde ich ausschließen:
Mit folgendem Import:
Mit der folgenden Funktion können Sie überprüfen, ob ein Port verfügbar ist oder nicht:
Ich gebe Ihnen eine ähnliche Funktion für diejenigen, die VB.NET verwenden :
quelle
Um die genaue Frage zu beantworten, ob ich in Dotnet Core 3.1 einen freien Port finden sollte (was ich in meinen Unit-Tests benötigte), habe ich mir das ausgedacht
Anmerkung: Basis der Kommentar von @ user207421 über Port Null Ich suchte und fand diese und es leicht modifiziert.
quelle
Beachten Sie das Zeitfenster zwischen Ihrer Überprüfung und dem Moment, in dem Sie versuchen, eine Verbindung herzustellen . Möglicherweise übernimmt ein Prozess den Port - die klassische TOCTOU . Warum versuchst du nicht einfach eine Verbindung herzustellen? Wenn dies fehlschlägt, wissen Sie, dass der Port nicht verfügbar ist.
quelle
Sie müssen nicht wissen, welche Ports auf Ihrem lokalen Computer geöffnet sind, um eine Verbindung zu einem Remote-TCP-Dienst herzustellen (es sei denn, Sie möchten einen bestimmten lokalen Port verwenden, dies ist jedoch normalerweise nicht der Fall).
Jede TCP / IP-Verbindung wird durch 4 Werte identifiziert: Remote-IP, Remote-Portnummer, lokale IP, lokale Portnummer. Sie müssen jedoch nur die Remote-IP und die Remote-Portnummer kennen, um eine Verbindung herzustellen.
Wenn Sie eine TCP-Verbindung mit erstellen
Ihr System weist Ihrer Verbindung automatisch eine von vielen freien lokalen Portnummern zu. Sie müssen nichts tun. Möglicherweise möchten Sie auch überprüfen, ob ein Remote-Port geöffnet ist. Aber es gibt keinen besseren Weg, als nur zu versuchen, eine Verbindung herzustellen.
quelle
quelle
quelle
Überprüfen Sie den Fehlercode 10048
quelle
Versuchen Sie dies. In meinem Fall war die Portnummer für das erstellte Objekt nicht verfügbar, daher habe ich mir diese ausgedacht
quelle