Wie kann ich offene Ports im Bereich von Ports finden?

8

Ich möchte einen offenen lokalen Port in einem bestimmten Bereich finden.

Wie kann ich das am effizientesten machen, ohne Verbindung zum Port herzustellen?

    
Erik Sapir 22.08.2011, 07:38
quelle

7 Antworten

6

Wenn Sie einen lokalen offenen Port zum Binden eines Servers suchen möchten, können Sie ein ServerSocket erstellen und wenn es keine Exception auslöst, ist es offen.

Ich habe folgendes in einem meiner Projekte gemacht:

%Vor%

RANDOM ist ein ThreadLocal hier, aber natürlich können Sie dort einen inkrementellen Teil machen.

    
KARASZI István 22.08.2011 07:42
quelle
3

Es gibt ein kleines Problem, auf das Sie in einer Multitasking-Windows / Unix-Umgebung stoßen können: Wenn etwas iPortAvailable (endgültiger int-Port) aus einer der Antworten ein wahr für Sie zurückgibt, heißt das nicht, dass Sie es in dem Moment tun werden tatsächlich binden es es wird noch verfügbar sein. Die bessere Lösung wäre das Erstellen einer Methode

%Vor%

Damit Sie es einfach starten und offene Sockets für Sie an einem verfügbaren Port im angegebenen Bereich erhalten.

    
Illarion Kovalchuk 22.08.2011 08:23
quelle
1

Wenn Sie Port auf einem Remote-Server meinen, benötigen Sie möglicherweise eine Bibliothek, die Raw-Socket unterstützt, um ein Sync-Paket zu senden und auf ein Sync-Ack-Paket zu warten, genau wie nmap tut es.

    
secmask 22.08.2011 07:44
quelle
0

Eine Möglichkeit besteht darin, einen nativen Netzwerkbefehl zu verwenden und die Ausgabe zu analysieren.

  1. Sie können den Befehl netstat auf Windows- und * nix-Plattformen verwenden.
  2. Typischer Befehl wäre netstat -n
  3. Die Ausgabe hat das folgende Format.

  4. Sie müssen die Spalte "Foreign Address" für localhost oder 127.0.0.1 analysieren und eine Liste der belegten Ports abrufen. Dann sehen Sie, ob sie in dem von Ihnen angegebenen Bereich liegen.

Santosh 22.08.2011 08:07
quelle
0

Wenn es sich nicht um Port-Sniffing, sondern um Service Discovery handelt, sollten Sie einen Rendez-Vous-Server (wie einen RMI-Server) oder das UDP-Protokoll verwenden. Früher haben wir JXTA dafür benutzt, aber ich hoffe, dass es dafür jetzt eine bessere Alternative gibt.

    
Adriaan Koster 22.08.2011 08:38
quelle
0

Im Wesentlichen die gleiche Idee wie Karaszi, aber anstatt so viele Sockets zu konstruieren, verwenden Sie die InetSocketAddress und versuchen, einen ServerSocket an jede Adresse in der Reihe zu binden, bis Sie eine offene treffen.

Wenn Sie nicht an diesen Port binden möchten (obwohl Sie den Socket im nächsten Moment nach der Überprüfung möglicherweise nicht binden können), verwenden Sie ein einfaches Socket-Objekt und versuchen Sie, eine Verbindung zu den Ports herzustellen - wenn es funktioniert, wird der Port genommen, wenn nicht (und Sie haben keine Firewall, die die Verbindung verbietet), dann ist es wahrscheinlich kostenlos.

    
Michael Kutschke 22.08.2011 11:34
quelle
0

Übergeben Sie einfach Null als Portnummer an die neue ServerSocket (), dann wird es eine für Sie finden. Aber Sie können den Bereich vergessen, er wird aus dem vom System definierten Bereich auswählen.

    
EJP 22.08.2011 11:41
quelle

Tags und Links