Odd InetAddress.isReachable () problem
Moja praca polega na opracowywaniu oprogramowania do kamer sieciowych do zastosowań w handlu detalicznym. Jednym z elementów oprogramowania tworzonego przez mój zespół jest serwer WWW, który pobiera różne raporty generowane w HTML przez samą kamerę (która ma własny wbudowany serwer internetowy) i jest przechowywany w kamerze. Nasze oprogramowanie pobierze te raporty z kamery i przechowa je na centralnym serwerze WWW.
Chociaż dobrze podłączamy adresy IP kamer do naszego oprogramowania, opracowuję prostą klasę Java, która będzie sprawdzać sieć i lokalizować wszystkie kamery w sieci.
Problem polega jednak na tym, że chociaż działa dobrze na moim komputerze i komputerze mojego współpracownika, gdy próbujemy uruchomić go na rzeczywistym komputerze PC, który będzie hostował nasze oprogramowanie ... działa, ale mówi, że każdy adres IP w podsieci jest offline / nieosiągalny Z WYJĄTKIEM IP bramy.
Na przykład, jeśli uruchomię go z mojego komputera lub współpracującego z nim komputera po podłączeniu do zamkniętej sieci LAN, otrzymam następujące aktywne adresy IP i flagę informującą mnie, czy jest to kamera, czy nie. (brama to 192.168.0.1, maska podsieci to 255.255.255.0, co oznacza pełny zakres 256 urządzeń do wyszukania)
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
Ale z jakiegoś powodu, uruchamiając ten sam program z komputera z serwerem WWW, używając tego samego środowiska JRE, otrzymuję tylko następujące informacje
IP:/192.168.0.1 Active:true Camera:false
Teraz mój kod, zamiast wyliczać po kolei każdy adres IP w głównym wątku, tworzy oddzielny wątek dla każdego sprawdzanego adresu IP i uruchamia je jednocześnie (w przeciwnym razie wyliczenie całego zakresu adresów IP zajęłoby niewiele ponad 21 minut) limit czasu 5000ms / IP). Główny wątek ponownie uruchamia te wątki skanowania IP co 15 sekund.
Sprawdziłem, czy wszystkie wątki są uruchomione na wszystkich komputerach, nie są wyrzucane wyjątki. Nawet zweryfikowałem, że żaden z wątków nie utknął. Każdy wątek trwa od 5001 do 5050 ms od początku do końca, a te wątki, które mają aktywny adres IP, kończą się szybciej (> 5000 ms), więc wiem, że poprawnie czeka na pełne 5000 ms w metodzie ipAddr.isReachable (5000).
Ja i mój współpracownik jesteśmy w tym momencie zdezorientowani, podczas gdy wydaje się, że osiąga te aktywne IP dobrze, gdy działa na naszych komputerach, ale nie otrzymuje odpowiedzi od komputera z serwerem WWW?
Wykluczyliśmy problemy z zaporą sieciową, problemy z dostępem administracyjnym itp. Jedyną różnicą jest to, że nasz serwer internetowy to Embedded Win XP, a nasze komputery PC to Windows 7.
To nas zakłopotało. Jakieś pomysły dlaczego?
Poniżej znajduje się kod uruchamiający każdy wątek 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();
}
EDYTOWAĆ: Oto kod, który buduje każdy adres IP w celu sprawdzenia po określeniu zakresu na podstawie bramy i podsieci ...
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();
}}