148 Stimmen

Wie kann man in C# prüfen, ob ein TCP-Port verfügbar ist?

In C# zu verwenden, ein TcpClient oder im Allgemeinen zu einem Socket zu verbinden, wie kann ich zuerst überprüfen, ob ein bestimmter Port auf meinem Rechner frei ist?

Mehr Informationen: Dies ist der von mir verwendete Code:

TcpClient c;
//I want to check here if port is free.
c = new TcpClient(ip, port);

3voto

ipGlobalProperties.GetActiveTcpConnections() gibt keine Verbindungen im Listen State zurück.

Port kann zum Abhören verwendet werden, aber wenn niemand mit ihm verbunden ist, funktioniert die oben beschriebene Methode nicht.

3voto

John Leidegren Punkte 57871

Netstat! Das ist ein Netzwerk-Befehlszeilenprogramm, das mit Windows mitgeliefert wird. Es zeigt alle derzeit bestehenden Verbindungen und alle Ports an, die gerade abgehört werden. Sie können dieses Programm zur Überprüfung verwenden, aber wenn Sie dies aus dem Code heraus tun wollen, schauen Sie in den Namespace System.Net.NetworkInformation? Es ist ein neuer Namespace ab 2.0. Dort gibt es einige Leckerbissen. Aber letztendlich, wenn Sie die gleiche Art von Informationen erhalten wollen, die über den Befehl netstat verfügbar sind, müssen Sie zu P/Invoke... führen.

Aktualisierung: System.Net.NetworkInformation

Dieser Namespace enthält eine Reihe von Klassen, die Sie verwenden können, um Dinge über das Netzwerk herauszufinden.

Ich konnte das alte Stück Code nicht finden, aber ich denke, Sie können etwas Ähnliches selbst schreiben. Ein guter Anfang ist es, sich die IP-Helfer-API . Google MSDN für die GetTcpTable WINAPI-Funktion und verwenden Sie P/Invoke zum Aufzählen, bis Sie die benötigten Informationen haben.

2voto

Moose Punkte 5214

Sie sagen

Ich meine, dass es von keinem der folgenden Unternehmen genutzt wird anderen Anwendung verwendet wird. Wenn eine Anwendung einen Port benutzt, können andere ihn nicht benutzen bis er frei wird.

Aber Sie können immer eine Verbindung zu einem Anschluss herstellen, während andere ihn benutzen, wenn dort etwas abgehört wird. Andernfalls wäre der http-Port 80 ein einziges Chaos.

Wenn Ihr

   c = new TcpClient(ip, port);

scheitert, dann wird dort nichts gehört. Andernfalls wird eine Verbindung hergestellt, auch wenn eine andere Maschine/Anwendung einen Socket zu dieser IP und diesem Port geöffnet hat.

2voto

Mohsen Punkte 3298

Prüfung auf Fehlercode 10048

try
{
    TcpListener tcpListener = new TcpListener(ipAddress, portNumber);
    tcpListener.Start();
}
catch(SocketException ex)
{
    if(ex.ErrorCode == 10048)
    {
        MessageBox.Show("Port " + portNumber + " is currently in use.");
    }
    return;
}

1voto

Michał Piaskowski Punkte 3772

Sie müssen nicht wissen, welche Ports auf Ihrem lokalen Rechner offen sind, um eine Verbindung zu einem entfernten TCP-Dienst herzustellen (es sei denn, Sie wollen einen bestimmten lokalen Port verwenden, aber das ist normalerweise nicht der Fall).

Jede TCP/IP-Verbindung wird durch 4 Werte identifiziert: entfernte IP, entfernte Portnummer, lokale IP, lokale Portnummer, aber Sie müssen nur die entfernte IP und die entfernte Portnummer kennen, um eine Verbindung herzustellen.

Wenn Sie eine tcp-Verbindung mit

TcpClient c;
c = new TcpClient(remote\_ip, remote\_port);

Ihr System weist Ihrem Anschluss automatisch eine der vielen freien lokalen Portnummern zu. Sie brauchen nichts zu tun. Vielleicht möchten Sie auch prüfen, ob ein entfernter Anschluss offen ist, aber es gibt keinen besseren Weg, als einfach zu versuchen, eine Verbindung herzustellen.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X