Проверьте, какие порты используются

Как я могу проверить, на каких портах работает служба определенного IP-адреса. (код на java пожалуйста)

Изменить: мой профессор спрашивает: «Каждый раз, когда программа обнаруживает работающую службу, она должна печатать сообщение». Исходя из этого, я подумал, что он хочет, чтобы я узнал, какие порты используются. Тем не менее, я только что спросил его снова. И он сказал мне, что мне просто нужно определить порт, который свободен (не используется).

Итак, я думаю, что решил свою проблему. Спасибо за помощь.


person John    schedule 10.02.2011    source источник
comment
Вы имеете в виду что-то вроде nmap? (nmap.org).   -  person clstrfsck    schedule 10.02.2011


Ответы (5)


InetAddress addr = InetAddress.getByName("hostName");  
Socket socket = new Socket(addr, 8090);  

Идея хита/пробы заключалась бы в том, чтобы попробовать разные порты. Если приведенный выше фрагмент кода не выдает исключение, значит, хост принимает соединения на этом порту. Если это не так, вы увидите исключение, обычно ConnectException. Я не утверждаю, что это идеальный способ, но это просто вариант.

person Piyush Mattoo    schedule 10.02.2011
comment
Да, я знаю, как найти свободный порт. Но я хочу найти порт, в котором есть работающая служба. - person John; 10.02.2011

public int getServiceByName(String tcpipService, String tcpipClass) {
    int port = -1;
    try {
        String line;
        BufferedReader br = new BufferedReader(
                    new InputStreamReader(
                       new FileInputStream(
                        "/etc/services")));
        while (((line = br.readLine()) != null)
                && (port == -1)) {
            if ((line.length() != 0)
                    && (line.charAt(0) != '#')) {
                port = parseServicesLine(line,
                    tcpipService, tcpipClass);
            }
        }   
        br.close();
        return (port); 
    } catch (IOException ioe) {
        return -1; 
    }
}   

private int parseServicesLine(String line,
        String tcpipService) {
    StringTokenizer st = new
        StringTokenizer(line, " \t/#");

    if (! st.hasMoreTokens()) {
        return -1; // error
    }
    String name = st.nextToken().trim();

    if (! st.hasMoreTokens()) {
        return -1; // error
    }
    String portValue = st.nextToken().trim();

    // Return port number, if name on this line matches:
    if (name.equals(tcpipService)) {
        try { 
            return (Integer.parseInt(portValue));
        } catch (NumberFormatException nfe) {
            return -1; 
        }
    } else {
        return -1; 
    }
}   

Приведенный выше фрагмент кода ищет файл /etc/inet/services по имени службы и возвращает номер порта.

person Piyush Mattoo    schedule 10.02.2011

Попробуйте использовать команду netstat в командной строке. Вы можете набрать netstat -h, чтобы увидеть справку, но похоже, что netstat -b покажет запущенные процессы.

person Paul    schedule 10.02.2011

Если вы имеете в виду запуск программы Java на компьютере для проверки доступности порта этого компьютера, посмотрите здесь.

Проверка доступности порта в Java

Если вы имеете в виду использование программы Java для получения информации о порте с удаленного компьютера, удачи. Вы можете попробовать подключиться к разным портам и проверить, какие из них отказываются от соединения... но это ужасная идея.

person Coeffect    schedule 10.02.2011
comment
Если в соединении отказано, это означает, что порт используется? - person John; 10.02.2011
comment
Извините, «отказался» было, наверное, неправильным словом. Вы получите сообщение об ошибке тайм-аута, если попытаетесь подключиться к IP/порту, который не принимает/не прослушивает соединения. В частности, вы, скорее всего, получите следующее: java.net.ConnectException: Время ожидания подключения истекло: подключение - person Coeffect; 10.02.2011

Вам нужно либо выполнить аргумент командной строки (например, netstat) из java, либо выполнить сканирование портов. Сканирование портов также обнаружит порты, которые вы не можете прослушивать, даже если они не используются. Ваша система может запретить порт 443, если вы, например, не являетесь пользователем root.

Что-то вроде:

for(int port=0; port<65536; port++)
{
    try
    {
        new ServerSocket(port);
        System.out.println("Successfully listend on port " + port);
        //clean up socket here
    }
    catch (IOException e)
    {
        System.out.println("Could not listen on port " + port);
    }
}
person Peter DeWeese    schedule 10.02.2011
comment
Не удалось прослушать порт, значит, на этом порту запущена служба? Потому что я хочу определить, есть ли служба на этом порту или нет. - person John; 10.02.2011
comment
Это для вашей собственной системы. Я полагаю, что он спрашивает об удаленной системе. Этот базовый код по-прежнему работает, за исключением того, что вы будете использовать клиентский сокет и пытаться подключиться к удаленной системе. - person Jumbogram; 10.02.2011
comment
Извини. Я забыл взять слово не из одного из них. - person Peter DeWeese; 10.02.2011
comment
Он не идентифицирует мой оракул, работающий на 8080 - person Syed Siraj Uddin; 13.04.2015