Проверьте, используется ли удаленный порт - PullRequest
8 голосов
/ 08 марта 2011

Мне нужно обнаружить открытые порты на удаленном сервере. Мне интересно, возможно ли это? Я думал, что открою сокет, и если это удастся, это означает, что он используется ... в противном случае, если я получаю исключение, то он не используется.

Например,

public boolean isActive() {
    Socket s = null;
    try {
        s = new Socket();
        s.setReuseAddress(true);
        SocketAddress sa = new InetSocketAddress(this.host, this.port);
        s.connect(sa, 3000);
        return true;
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (s != null) {
            try {
                s.close();
            } catch (IOException e) {
            }
        }
    }
    return false;
}

это жизнеспособный подход?

Ответы [ 2 ]

14 голосов
/ 15 июля 2013

FWIW, Java-решение, которое я использую время от времени (лучше, чем telnet: поддерживает тайм-аут).

package com.acme.util;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.net.SocketAddress;
import java.net.SocketTimeoutException;
import java.net.UnknownHostException;

public class CheckSocket {

    public static void main(String[] args) {
        int exitStatus = 1 ;
        if (args.length != 3) {
            System.out.println("Usage: CheckSocket node port timeout");
        } else {
            String node = args[0];
            int port = Integer.parseInt(args[1]);
            int timeout = Integer.parseInt(args[2]);

            Socket s = null;
            String reason = null ;
            try {
                s = new Socket();
                s.setReuseAddress(true);
                SocketAddress sa = new InetSocketAddress(node, port);
                s.connect(sa, timeout * 1000);
            } catch (IOException e) {
                if ( e.getMessage().equals("Connection refused")) {
                    reason = "port " + port + " on " + node + " is closed.";
                };
                if ( e instanceof UnknownHostException ) {
                    reason = "node " + node + " is unresolved.";
                }
                if ( e instanceof SocketTimeoutException ) {
                    reason = "timeout while attempting to reach node " + node + " on port " + port;
                }
            } finally {
                if (s != null) {
                    if ( s.isConnected()) {
                        System.out.println("Port " + port + " on " + node + " is reachable!");
                        exitStatus = 0;
                    } else {
                        System.out.println("Port " + port + " on " + node + " is not reachable; reason: " + reason );
                    }
                    try {
                        s.close();
                    } catch (IOException e) {
                    }
                }
            }
        }
        System.exit(exitStatus);
    }
}
3 голосов
/ 08 марта 2011

Должно ли это быть сделано в Java?Для этого есть инструменты ( Nmap ).Иначе, ваш метод будет «работать», но я не уверен, насколько это будет полезно.

Имейте в виду, брандмауэры могут делать некоторые хитрые вещи.Например, позволяют устанавливать соединения, но ничего с этим не делать, поэтому создается впечатление, что порт открыт, но брандмауэр фактически блокирует весь трафик.Или некоторые порты будут открыты только для запросов из определенного диапазона IP-адресов, подсети или физического устройства.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...