Нечетная проблема InetAddress.isReachable ()

Моя работа заключается в разработке программного обеспечения для сетевых камер для розничной торговли. Одной из разновидностей программного обеспечения, которую разрабатывает моя команда, является веб-сервер, который извлекает различные отчеты, сгенерированные в HTML самой камерой (которая имеет собственный встроенный веб-сервер) и сохраненные на камере. Наше программное обеспечение затем получит эти отчеты с камеры и сохранит их на центральном веб-сервере.

Хотя мы успешно подключаем IP-адреса камер к нашему программному обеспечению, я разрабатываю простой класс Java, который будет запрашивать сеть и определять местонахождение всех камер в сети.

Проблема, однако, в том, что, хотя он прекрасно работает на моем ПК и компьютере моего коллеги, когда мы пытаемся запустить его на реальном компьютере веб-сервера, на котором будет размещаться наше программное обеспечение ... оно работает, но говорит, что каждый IP в подсети отключен / недостижимо, КРОМЕ IP шлюза.

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

IP:/192.168.0.1  Active:true Camera:false
IP:/192.168.0.100  Active:true Camera:true    <- this is camera 1
IP:/192.168.0.101  Active:true Camera:true    <- this is camera 2
IP:/192.168.0.103  Active:true Camera:false   <- my PC
IP:/192.168.0.104  Active:true Camera:false   <- this is our webserver

Но по какой-то причине при запуске той же программы с ПК веб-сервера, использующей ту же JRE, я обнаружил только следующее

IP:/192.168.0.1  Active:true Camera:false

Теперь мой код вместо того, чтобы перечислять каждый IP по порядку в основном потоке, вместо этого создает отдельный поток для каждого проверяемого IP-адреса и выполняет их одновременно (в противном случае для перечисления всего диапазона IP-адресов потребуется чуть более 21 минуты). тайм-аут 5000 мс / IP). Затем основной поток повторно запускает эти потоки сканирования IP каждые 15 секунд снова и снова.

Я проверил, что все потоки на всех ПК работают до конца, исключений не выдается. Даже проверил, что ни один из потоков не застревает. Каждый поток занимает от 5001 до 5050 мс от начала до завершения, и те потоки, которые имеют активный IP-адрес, заканчивают раньше (> 5000 мс), поэтому я знаю, что он правильно ожидает полные 5000 мс в методе ipAddr.isReachable (5000).

Я и мой коллега в данный момент в замешательстве, хотя кажется, что эти активные IP-адреса нормально работают при работе на наших ПК, но не получают ответа от ПК веб-сервера ???

Мы исключили проблемы с брандмауэрами, проблемы с правами администратора и т. Д. Единственное отличие состоит в том, что наш веб-сервер - это Embedded Win XP, а наши ПК - Windows 7.

Это поставило нас в тупик. Есть идеи почему?

Ниже приведен код, который запускает каждый поток IP:

public void CheckIP() {
new Thread() {
    @Override
    public void run() {
        try {
            isActive = ipAddr.isReachable(5000);
            if (isActive) {
                if (!isCamera) {
                    isCamera = new IpHttpManager().GetResponse(ipAddr.toString());
                }
            } else {
                isCamera = false;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}.start();

}

РЕДАКТИРОВАТЬ: Вот код, который создает каждый IP для проверки после определения диапазона на основе шлюза и подсети ...

for(int i=subMin; i<=subMax; i++) {
byte[] ip = new byte[] {(byte)oct[0],(byte)oct[1],(byte)oct[2],(byte)i};
try {
    scanners[subCount] = new IpScan(InetAddress.getByAddress(ip));
    subCount++;
} catch (UnknownHostException e) {
    e.printStackTrace();
}}

Ответы на вопрос(2)

Ваш ответ на вопрос