domenica 5 aprile 2009

VB.NET : My.Computer.Network.IsAvailable vs schede di rete virtuali

Se state utilizzando l’oggetto Network di My.Computer ed in particolare la proprieta’ IsAvailable fate attenzione perche’ viene ingannata dalla presenza di schede di rete virtuali.

Nella mia macchina di sviluppo, infatti, ho due schede virtuali installate da VMWare e, anche se mi disconnetto dalla rete, IsAvailable continua ad essere sempre a true.

Se disabilito le schede virtuali, ovviamente, IsAvailable ritorna a lavorare correttamente.

Per risolvere questo problema potete utilizzare IsAvailable in combinazione con Ping andando a vedere se, effettivamente si “pinga” un indirizzo di rete noto:

If My.Computer.Network.IsAvailable = True And
   My.Computer.Network.Ping([indirizzo], 10000) Then
     ' Computer connesso
Else
     ' Computer disconnesso
End If

dove [indirizzo] e’ un indirizzo noto.

Altra soluzione e’ quella di richiamare, tramite P/Invoke, la dll di sistema wininet.dll ed in particolare la funzione di libreria InternetGetConnectedState.

Definiamo la dllimport:

DllImport("wininet.dll")> _
Public Function InternetGetConnectedState(ByRef flags
    As UInt32, ByVal dwReserved As UInt32) As Boolean
End Function

e il controllo sulla presenza di rete diventa:

If InternetGetConnectedState(0, 0) = True Then
     ' Computer connesso
Else
     ' Computer disconnesso
End If

Ho testato il tutto su diversi sistemi operativi e mi manca solo Windows Server 2008, ma per il resto sembra funzionare.

Nessun commento: