Проверьте, какие порты используются - PullRequest
1 голос
/ 10 февраля 2011

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

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

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

Ответы [ 5 ]

1 голос
/ 10 февраля 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 по имени службы и возвращает номер порта.

1 голос
/ 10 февраля 2011
InetAddress addr = InetAddress.getByName("hostName");  
Socket socket = new Socket(addr, 8090);  

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

0 голосов
/ 10 февраля 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);
    }
}
0 голосов
/ 10 февраля 2011

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

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

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

0 голосов
/ 10 февраля 2011

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

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