Проблема с сетью Java - PullRequest
       1

Проблема с сетью Java

3 голосов
/ 26 февраля 2011

У нас есть маршрутизатор и 3 компьютера.

  1. ПК1: 192.168.1.2 (беспроводной)
  2. ПК2: 192.168.1.3 (беспроводной)
  3. ПК3: 192.168.1.6

Шлюз по умолчанию: 192.168.1.1

Когда PC3 пытался найти подключенные ПК, используя код из этого сообщения на форуме , он возвращает толькоIP-адрес шлюза по умолчанию (этот адрес является единственным достижимым адресом).

Я попытался увеличить время ожидания для метода isReachable().Но он по-прежнему возвращает только адрес шлюза по умолчанию.

Я пытался сделать это с отдельными IP-адресами.

try {
            InetAddress temp2 = InetAddress.getByAddress(new byte[]{(byte) 192, (byte) 168, (byte) 1, (byte) 2});
            if (temp2.isReachable(1100)) {
                java.lang.System.out.println("IP Address: " + temp2.getHostAddress() + " has connection.");
            }else{
                java.lang.System.out.println("IP Address: " + temp2.getHostAddress() + " has no connection.");
            }
        } catch (Exception ex) {
            java.lang.System.out.println("Error: " + ex.getMessage());
        }  

И все же, делая эти IP-адреса ПК1 и ПК2, я получил только нетсостояние соединения.(Это означает, что эти IP-адреса недоступны.)

Но когда я пингую их на своей консоли Windows, эти IP-адреса подключаются, и пинг проходит успешно.

  1. В чем проблема с моей настройкой.
  2. Как мне решить эту проблему.

1 Ответ

2 голосов
/ 28 февраля 2011

Я считаю, что Гвидо прав в своей теории в комментариях. См. этот вопрос . Я понимаю, что связанный ответ применим к хостам Linux / UNIX, но я только что проверил ваш код на компьютере с Windows 7 и убедился, что он также отправляет пакеты TCP на порт echo (7), а не на эхо-запрос ICMP. (Я проверял это под версией Java 1.6.0_21 на коробке Windows 7, где ver сообщил Microsoft Windows [Version 6.1.7600])

На типичной машине с Windows, вероятно, включен брандмауэр Windodws. Поэтому вероятна следующая последовательность событий:

  1. Ваша Java-программа (не способная отправлять и получать ICMP-пакеты для проверки доступности удаленного хоста Windows) попытается установить TCP-соединение с удаленным хостом Windows, отправив пакет SYN (синхронизация) на порт 7
  2. Удаленный хост Windows будет отбрасывать пакет, а не отвечать пакетом RST, как того требует RFC 793 , если ни одна служба не прослушивала этот порт. То есть удаленный хост Windows должен иметь , в соответствии с RFC, либо ответил TCP:
    • RST: если порт не прослушивал соединения
    • SYN + ACK: если порт был открыт и прослушивал соединения
  3. Поскольку ваша Java-программа ожидала, что на шаге (2) произойдет одно из двух, но вместо этого вообще не получила ответа (поскольку Windows отбросила пакет SYN до того, как он попал в стек TCP), она ложно предполагает, что удаленная Windows хост не работает.

Трудно сказать, в чем заключается "проблема с вашей настройкой". Может быть, ничего. Это зависит от того, для чего вы пытаетесь использовать эту функциональность. Вы можете поступить об этом неправильно. Вы должны понимать, что ping не всегда является 100% точным способом проверить, находится ли хост в сети. В вашем случае может быть более точным проверить таблицу ARP после попытки пропинговать хост, если вас интересуют только хосты в вашей локальной сети.

Возможные обходные пути:

  • Попробуйте временно отключить брандмауэр Windows на одном из других компьютеров и посмотрите, работает ли ваш код.
  • Напишите некоторый код, который выполняет отдельный процесс, например, запускает утилиту командной строки ping для проверки достижимости.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...