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);

257voto

jro Punkte 7212

Da Sie eine TcpClient bedeutet dies, dass Sie offene TCP-Ports überprüfen. Es gibt viele gute Objekte, die in der System.Net.NetworkInformation Namensraum.

Verwenden Sie die IPGlobalProperties Objekt, um zu einem Array von TcpConnectionInformation Objekte, die Sie dann nach Endpunkt-IP und -Port abfragen können.


 int port = 456; //<--- This is your value
 bool isAvailable = true;

 // Evaluate current system tcp connections. This is the same information provided
 // by the netstat command line application, just in .Net strongly-typed object
 // form.  We will look through the list, and if our port we would like to use
 // in our TcpClient is occupied, we will set isAvailable to false.
 IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
 TcpConnectionInformation[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpConnections();

 foreach (TcpConnectionInformation tcpi in tcpConnInfoArray)
 {
   if (tcpi.LocalEndPoint.Port==port)
   {
     isAvailable = false;
     break;
   }
 }

 // At this point, if isAvailable is true, we can proceed accordingly.

52voto

Hans Passant Punkte 894572

Sie sind am falschen Ende des Intertube. Es ist der Server, der nur einen bestimmten Port offen haben kann. Etwas Code:

  IPAddress ipAddress = Dns.GetHostEntry("localhost").AddressList[0];
  try {
    TcpListener tcpListener = new TcpListener(ipAddress, 666);
    tcpListener.Start();
  }
  catch (SocketException ex) {
    MessageBox.Show(ex.Message, "kaboom");
  }

Scheitert mit:

Normalerweise ist nur eine Verwendung jeder Socket-Adresse (Protokoll/Netzwerkadresse/Port) zulässig.

19voto

paxdiablo Punkte 809679

Wenn Sie eine TCP-Verbindung aufbauen, muss das 4er-Tupel (Quell-IP, Quell-Port, Ziel-IP, Ziel-Port) eindeutig sein, um sicherzustellen, dass die Pakete an die richtige Stelle zugestellt werden.

Eine weitere Einschränkung besteht in der Server Seite, dass sich nur ein Serverprogramm an eine eingehende Portnummer binden kann (unter der Annahme einer IP-Adresse; Multi-NIC-Server haben andere Fähigkeiten, die wir hier aber nicht zu diskutieren brauchen).

Also, auf der Server-Seite, Sie:

  • einen Socket erstellen.
  • diesen Socket an einen Port binden.
  • auf diesen Port hören.
  • Verbindungen auf diesem Port akzeptieren. und es können mehrere Verbindungen ankommen (eine pro Client).

Auf der Kundenseite ist es in der Regel ein wenig einfacher:

  • einen Socket erstellen.
  • die Verbindung zu öffnen. Wenn ein Client die Verbindung öffnet, gibt er die IP-Adresse und den Port des Server . Sie kann seinen Quellport angeben, sondern normalerweise den Wert Null, was dazu führt, dass das System ihm automatisch einen freien Port zuweist.

Es gibt keine Die Anforderung, dass die Ziel-IP/Port einmalig sein muss, da dies dazu führen würde, dass immer nur eine Person Google nutzen könnte, und das würde ihr Geschäftsmodell ziemlich zerstören.

Das bedeutet, dass Sie sogar so wundersame Dinge wie Multisession-FTP tun können, da Sie mehrere Sitzungen einrichten, bei denen der einzige Unterschied der Quellport ist, so dass Sie Pakete parallel herunterladen können. Bei Torrents ist es etwas anders, da das Ziel jeder Sitzung normalerweise ein anderes ist.

Und, nach all dem Geschwafel (sorry), ist die Antwort auf Ihre Frage, dass Sie keinen freien Port angeben müssen. Wenn Sie eine Verbindung zu einem Server mit einem Aufruf herstellen, der Ihren Quellport nicht angibt, wird er mit ziemlicher Sicherheit heimlich Null verwenden und das System wird Ihnen einen unbenutzten Port zuweisen.

17voto

Melloware Punkte 8373

Vielen Dank für diesen Tipp. Ich brauchte die gleiche Funktionalität, aber auf der Server-Seite zu überprüfen, ob ein Port verwendet wurde, so dass ich es zu diesem Code geändert.

 private bool CheckAvailableServerPort(int port) {
    LOG.InfoFormat("Checking Port {0}", port);
    bool isAvailable = true;

    // Evaluate current system tcp connections. This is the same information provided
    // by the netstat command line application, just in .Net strongly-typed object
    // form.  We will look through the list, and if our port we would like to use
    // in our TcpClient is occupied, we will set isAvailable to false.
    IPGlobalProperties ipGlobalProperties = IPGlobalProperties.GetIPGlobalProperties();
    IPEndPoint[] tcpConnInfoArray = ipGlobalProperties.GetActiveTcpListeners();

    foreach (IPEndPoint endpoint in tcpConnInfoArray) {
        if (endpoint.Port == port) {
            isAvailable = false;
            break;
        }
    }

    LOG.InfoFormat("Port {0} available = {1}", port, isAvailable);

    return isAvailable;
}

16voto

Indy9000 Punkte 8404
TcpClient c;

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

...wie kann ich zuerst prüfen, ob ein bestimmter Port auf meinem Rechner frei ist?

Ich meine damit, dass es von keiner anderen Anwendung verwendet wird. Wenn eine Anwendung einen Anschluss verwendet, können andere ihn nicht nutzen, bis er frei wird. - Ali

Sie haben falsch verstanden, was hier passiert.

Die Parameter von TcpClient(...) sind die Server-IP und der Server-Port, zu denen 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 besteht keine Notwendigkeit, die Verfügbarkeit des lokalen Ports zu prüfen, da dies automatisch von der Winsock-Schicht übernommen wird.

Falls Sie mit dem obigen Codefragment keine Verbindung zum Server herstellen können, könnte das Problem eines oder mehrere von mehreren sein. (z.B. Server IP und/oder Port ist falsch, Remote Server nicht verfügbar, etc.)

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