2011-08-19 9 views
7

Jest tam interfejs API (NetworkInterface, InetAddress, itp.) W Javie, dzięki któremu mogę wykryć, że karta sieciowa nie jest połączona.Jak wykryć, czy karta sieciowa nie jest połączona z Javą bez opóźnienia?

Problem polega na tym, że niektóre interfejsy API sieci mają duży limit czasu. Ale jeśli karta sieciowa nie jest podłączona do żadnego kabla, możemy ją pominąć. Problem tylko wydaje się występować z Windows 7.

+0

Wiele ustawień limitu czasu można kontrolować na poziomie JVM (patrz odpowiedź Snicolasa). Inne, musisz ustawić je na poziomie systemu operacyjnego i musisz ustawić je jako "warunek wstępny" na poziomie systemu operacyjnego dla twojej aplikacji java. Być może nie rozumiem twojego problemu, ale wydaje mi się, że w pewnym momencie wdrożenie JVM musi "zawierać pewne założenia dotyczące tego, co jest dostarczane przez podstawowy system operacyjny. Dobre pytanie (+1 dla ciebie). –

Odpowiedz

1

Można korzystać z niektórych właściwości systemowe Java, aby ustawić domyślny czas out do podłączenia gniazda przy użyciu

sun.net.client.defaultConnectTimeout 

(all properties here)

Ale wydaje mnie, że sprawdzanie, czy konkretny kontroler dostępu do medium jest obecny, nie jest zadaniem bazowego systemu operacyjnego. Nie mogę powiedzieć wiele o Windows 7, mam dobry system operacyjny od 12 lat (Linux).

Pozdrawiam, Stéphane

+0

Zgadzam się z tobą w tej kwestii (że jest to zadanie na poziomie systemu operacyjnego, a nie JVM). OTH, można zrobić przypadek próbowania tego na poziomie JVM, jeśli implementuje się kontener lub frameworka (gdzie linie między oczekiwaniami na poziomie aplikacji i na poziomie systemu stają się niewyraźne.) –

+0

Nie sądzę, że zmiana limitu czasu pomoże. Jeśli sprawisz, że będzie zbyt krótki, upłynie limit czasu, jeśli wystąpi faktyczne opóźnienie połączenia. Istnieją jednak okoliczności (takie jak brak karty sieciowej), gdy nie jest możliwe połączenie sieciowe, a osoba przesłuchująca chce to natychmiast wykryć. – DJClayworth

2

miałem ten sam problem. Skończyło się na tym:

Enumeration<NetworkInterface> eni = NetworkInterface.getNetworkInterfaces(); 
     while(eni.hasMoreElements()) { 
      Enumeration<InetAddress> eia = eni.nextElement().getInetAddresses(); 
      while(eia.hasMoreElements()) { 
       InetAddress ia = eia.nextElement(); 
       if (!ia.isAnyLocalAddress() && !ia.isLoopbackAddress() && !ia.isSiteLocalAddress()) { 
        if (!ia.getHostName().equals(ia.getHostAddress())) 
         return true; 
       } 
      } 
     } 

Działa z Java 5+. Również pośrednio sprawdza DNS (porównując nazwy/adresy).

+0

Problem polega na tym, że funkcja getHostName() blokuje się przez około 5 sekund, jeśli koszyk sieciowy nie jest podłączony. – Horcrux7

+0

To nie dla mnie. Jeśli nie jest podłączony, nazwa hosta jest taka sama, jak adres hosta. EDYCJA: znowu sprawdzam stos IPv6, więc nie jestem pewien zachowania IPv4 ... Myślę, że byłoby tak samo. – BenCole

Powiązane problemy