2017-04-12 1 views
1

Ich habe unten eine einfache Java-Methode geschrieben, um zu überprüfen, ob Port 21 in Fedora Linux verwendet wird. Es wurde gemeldet, dass es bereits verwendet wird.Warum stimmt ServerSocket in Java nicht mit netstat -ant überein?

protected static boolean isPortInUseTCP(final int port) 
{ 
    Log.info("Checking TCP ports [" + port + "]", Verbosity.MEDIUM); 

    // Checks to see if the port is available (not in use), otherwise drop 
    // into the catch block if it is already used 
    try (ServerSocket ss = new ServerSocket(port)) 
    { 
     ss.setReuseAddress(true); 

     Log.info("Port number [" + port + "] not found via TCP port", Verbosity.MEDIUM); 

     return false; 
    } 

    catch (IOException exc) 
    { 
     Log.info("Port number [" + port + "] found via TCP port", Verbosity.MEDIUM); 
    } 

    return true; 
} 

Aber wenn netstat -ant zu überprüfen, ob es mit Java übereinstimmt, zeigt es nicht Port 21, wie in dem Einsatz nach oben? Warum? enter image description here

+0

Bitte melden Sie Ihre Ausnahmen, wenn sie gefangen werden, Sie vergessen sie einfach. – f1sh

Antwort

2

Ihr Java-Code zeigt nicht an, ob Port 21 verwendet wird oder nicht. Es zeigt an, ob Sie auf 21 hören können oder nicht. Da 21 ein privilegierter Port ist, wird sich die Ausnahme, die Sie erhalten, wahrscheinlich über fehlende Privilegien beschweren.

Machen Sie keine Annahmen über Ausnahmen. Hier ignorierst du einen komplett, vorausgesetzt, dass es darum geht, dass der Port verwendet wird und nicht über die erforderlichen Rechte, um diesen Port anzuhören.

Wenn Sie Ihr Java-Programm als root (eine schlechte Idee) ausführen, sollten Sie sehen, dass der Port nicht verwendet wird.

+0

Ja, ich habe erwartet, dass der Port nicht verwendet wird, weil netstat -ant korrekt ist. Ich habe gegooglet und ich habe viele Leute gesehen, die dieselbe Logik wie meine gemacht haben. Was ist der beste Weg zu überprüfen, ob der Port nicht verwendet wird, anstatt sich auf die Ausnahme (wahrscheinlich falsch positiv, wie Sie erwähnt haben) für die Antwort zu verlassen? – Trevor

+0

Wahrscheinlich gibt es irgendwo ein Duplikat. – Kayaman

+0

Beachten Sie, dass Sie Ihr Programm nicht als 'root' ausführen sollten. Sie müssen nur die entsprechenden Berechtigungen angeben, wenn Sie Ports <1024 verwenden möchten. – Kayaman

0

Ja, Sie haben Recht Port 21 ist ein privilegierter Port und die Ausnahme hat sich beschweren - java.net.BindException: Permission denied (Bind failed).

Wenn ich das Programm in root ausführen, bekam ich die richtige Antwort. Es sagte, dass der Port nicht benutzt wird. Also mein Problem war, dass ich mich selbst nicht zu dem richtigen Privileg gebracht habe. Danke, dass du mich auf meinen Fehler aufmerksam gemacht hast.

Verwandte Themen