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.