Rozpoznanie w sieci

0

Jak sprawdzić następujące informacje o sieci (posiadając 2 interfejsy + zwrotny):

  • przez który interfejs łączę się z internetem?
  • w przypadku gdy się nie łączę jakie dostępne adresy ip znajdują się po drugiej stronie (liczba mnoga bo mostek)?

próba z InetAddress.getByName("www.google.pl").isReachable(null,0,3000) zawsze zwraca false nie wiem czemu. Dla interfejsów z sieci lokalnej także...

0

Java operuje w najwyzszej warstwie (aplikacji) uproszczonego modelu OSI i, niestety, szerszy dostep do nizszych warstw najczesciej sprowadza sie do wykorzystania zewnetrznych bibliotek opartych na JNI (JPCap). Niemniej jednak, pewne mechanizmy sieciowe sa dostepne (@see Java Networking).

Co do poruszonego problemu:
a) liste dostepnych interfejsow mozna otrzymac w taki sposob:

NetworkInterface.getNetworkInterfaces()
Po szczegoly odsylam do dokumentacji J2SE.

b) interfejs wykorzystywany do polaczenia z Internetem mozna sprobowac otrzymac w taki sposob:

Socket s = new Socket("http://google.com", 80);
NetworkInterface ni = NetworkInterface.getByInetAddress(s.getLocalAddress());
System.out.println("connected through: " + ni.getDisplayName());

Napisalem sprobowac, bo musi byc spelnione kilka warunkow (dostepnosc serwera, otwarty port, nawiazane polaczenie z Internetem, itd.).

c) sprawdzanie dostepnosci zdalnego hosta raczej nie powinno sie opierac na metodzie InetAddress.isReachable(...). Zasada jej dzialania jest rozna w zaleznosci od OS'a, i tak:

  • Windows - metoda probuje otworzyc Socket na zdalnym hoscie, na porcie 7 (ECHO port) - jesli polaczenie zostanie nawiazane, metoda zwraca true. Ze wzgledu na to, ze coraz czesciej ten port jest blokowany przez zapory sieciowe, mozna jedynie przypuszczac, ze wynik jest zgodny ze stanem faktycznym, tj. host jest (nie)osiagalny.
  • Unix/Linux - metoda probuje wywolac "ping" systemowy (ICMP_REQUEST) pod warunkiem, ze ma uprawnienia do tego (uprawnienia root'a, ktorych najprawdopodobniej miec nie bedzie). W przeciwnym wypadku robi to samo pod Windows'em.

Niestety do tej pory Java nie wspiera pakietow ICMP.

0

ok, to już wiem :-) jednakże chciałbym metode, która za jednym razem sprawdza co znajduje się po drugiej stronie kabla/mostka. Nie chcę wywoływać jakichś pingowatych pakietów na każdy IP np dla maski 255.255.255.0 -> 10.0.0.2-254, bo to potrwa trochę długo, a efekt nie może odzwierciedlać prawdy ze wzgledu na firewall.

0

CMIIAW, ale najprostsza i najskuteczniejsza metoda sprawdzania dostepnosci zdalnego hosta jest poslanie mu ping'a (ICMP_REQ) i czekanie na odpowiedz. Jak rozumiem chcesz przeskanowac siec lokalna w poszukiwaniu innych urzadzen. Na Linux'ie/Mac OS mozesz sprobowac pobawic sie w "broadcast ping". W ostatecznosci mozesz tez sprobowac odejrzec tablice ARP (polecenie: arp -a), ale najlepiej bedzie zejsc do nizszego poziomu (warstwa transportowa) i samemu wypytac o stan sieci. Kwestie firewall'a w ogole pomijam.

0

z rozpoznaniem sobie poradziłem, teraz pozostała kwestia "przez który interfejs łączę się z internetem".

0

Runtime.getRuntime().exec() pozostało chyba...

1 użytkowników online, w tym zalogowanych: 0, gości: 1