Frage

Ich bin ein Port-Scanner in Java schreiben, und ich möchte, dass die folgenden vier Anwendungsfälle unterschiedliche Lage sein:

  • Port offen ist
  • Port ist offen und Server Banner wurde gelesen
  • Port geschlossen
  • Server ist nicht Live

Ich habe den folgenden Code:

    InetAddress address = InetAddress.getByName("google.com");
    int[] ports = new int[]{21, 22, 23, 80, 443};
    for (int i = 0; i < ports.length; i++) {
        int port = ports[i];
        Socket socket = null;
        try {
            socket = new Socket(address, port);
            socket.setSoTimeout(500);
            System.out.println("port " + port + " open");
            BufferedReader reader = new BufferedReader(
                 new InputStreamReader(socket.getInputStream()));
            String line = reader.readLine();
            if (line != null) {
                System.out.println(line);
            }
            socket.close();
        } catch (SocketTimeoutException ex) {
            // port was open but nothing was read from input stream
            ex.printStackTrace();
        } catch (ConnectException ex) {
            // port is closed
            ex.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (socket != null && !socket.isClosed()) {
                try {
                    socket.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }

Das Problem ist, dass ich eine Connection bekommen beide, wenn der Port geschlossen ist und der Server nicht erreicht werden kann, aber mit einer anderen Ausnahmemeldung:

java.net.ConnectException: Connection timed out: connect

, wenn die Verbindung wurde nie festgestellt und

java.net.ConnectException: Connection refused: connect

, wenn der Port geschlossen

so kann ich den Unterschied nicht zwischen den beiden Anwendungsfällen ohne in die eigentliche Ausnahmemeldung zu graben.

Das gleiche passiert, wenn ich einen anderen Ansatz für die Steckdose Schöpfung versuchen. Wenn ich benutze:

socket = new Socket();
socket.setSoTimeout(500);
socket.connect(new InetSocketAddress(address, port), 1000);

Ich habe das gleiche Problem, aber mit dem SocketTimeoutException statt. Ich erhalte eine

java.net.SocketTimeoutException: Lesen timed out

Wenn Port war offen, aber es gab keine Banner zu lesen und

werden

java.net.SocketTimeoutException: connect timed out

, wenn der Server nicht leben oder Port ist geschlossen.

Irgendwelche Ideen? Vielen Dank im Voraus!

War es hilfreich?

Lösung

Ich glaube nicht, dass Sie keine Optionen haben neben der Ausnahmemeldung Parsen. Gibt es einen Grund, warum Sie lieber nicht tun?

Andere Tipps

Connect hat nur ein leerer Konstruktor und ein errorMesssage Konstruktor. Es gibt keine Unterklassen von Connect in der API. So fürchte ich, Java hat keine richtige Weg, um den Grund für den Zugriff. die Ausnahmemeldung Parsen scheint die einzige Möglichkeit zu sein, obwohl es mit Übersetzungen wirklich chaotisch zu sein.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top