2011-08-19 8 views
7

C'è un'API (NetworkInterface, InetAddress, ecc.) In Java con cui posso rilevare che una scheda di rete non è connessa.Come posso rilevare se una scheda di rete non è connessa a Java senza ritardo?

Il problema è che l'indirizzamento di alcune API di rete ha un timeout elevato. Ma se la scheda di rete non è collegata a nessun cavo, possiamo saltarla. Il problema sembra solo verificarsi con Windows 7.

+0

Molte impostazioni di timeout possono essere controllate a livello JVM (vedere la risposta di Snicolas). Altri, devi impostarli a livello di sistema operativo e devi renderli una pre-condizione 'a livello di sistema operativo per la tua app java. Forse sto fraintendendo il tuo problema, ma mi sembra che ad un certo punto, la tua distribuzione JVM debba "fare" alcune ipotesi su ciò che viene fornito dal sistema operativo sottostante. Buona domanda però (+1 per te). –

risposta

1

Si potrebbe utilizzare alcune proprietà di sistema java per impostare l'intervallo di tempo predefinito per la connessione socket utilizzando

sun.net.client.defaultConnectTimeout 

(all properties here)

ma sembra me che controllare se uno specifico controller di accesso medio è presente o meno è il lavoro del sistema operativo sottostante. Non posso dirvi molto di Windows 7, ho avuto un buon sistema operativo da 12 anni (linux).

saluti, Stéphane

+0

Sono d'accordo con voi su questo (che si tratta di un'attività a livello di sistema operativo, non di una JVM.) OTH, si potrebbe fare il caso di provare a farlo a livello di JVM se si sta implementando un contenitore o un framework (dove le linee tra le aspettative a livello di app e di sistema diventano confuse). –

+0

Non credo che il timeout aiuterà. Se lo si rende troppo breve, si verificherà un timeout quando si verifica un ritardo effettivo della connessione. Ma ci sono circostanze (come non avere una scheda di rete) quando nessuna connessione di rete è possibile, e l'interrogante vuole rilevarlo immediatamente. – DJClayworth

2

Ho avuto questo stesso problema. Ho finito per usare questo:

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; 
       } 
      } 
     } 

Funziona con Java 5+. Controlla anche indirettamente DNS (confrontando nomi/indirizzi).

+0

Il problema è che getHostName() blocca per circa 5 secondi se il carrello di rete non è connesso. – Horcrux7

+0

Non fa per me. Se non è connesso, il nome host è uguale all'indirizzo host. EDIT: poi di nuovo, sto controllando uno stack IPv6, quindi non sono sicuro del comportamento di IPv4 ... penserei che sarebbe lo stesso però. – BenCole

Problemi correlati