OVH Cloud OVH Cloud

détecter connexion internet

13 réponses
Avatar
Sylo
Bonjour,

je dispose d'une application qui doit régulièrement vérifier si la machine
est connecté à internet.
Existe-t'il est objet dans le framework 1 ou 2 qui renvoi true si la machine
est connectée ou sinon false.
Je voudrais éviter de passer par des API

MErci

Sylo

10 réponses

1 2
Avatar
Patrick Philippot
Bonjour,

Je ne pense pas qu'il y ait un moyen de faire ça en mode managé sauf à
tester directement l'accès à un URL donné.

Concernant les méthodes non managées, voir un résumé ici:

http://www.ndis.com/faq/QA05040101.htm

Personnellement, j'ai toujours eu des difficultés avec les APIs
"officielles" et j'utilise une méthode particulière mise au point d'après
une idée originale de Edwin Eefting et décrite dans cet article:

http://www.codeguru.com/cpp/i-n/internet/generalinternet/comments.php/c3437/?threadC800

Je n'ai jamais eu de souci avec ce code quel que soit le type de connexion.
Ce code peut s'adapter à n'importe quel langage.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


"Sylo" <devbnet[at]free.fr> wrote in message
news:%
Bonjour,

je dispose d'une application qui doit régulièrement vérifier si la machine
est connecté à internet.
Existe-t'il est objet dans le framework 1 ou 2 qui renvoi true si la
machine est connectée ou sinon false.
Je voudrais éviter de passer par des API

MErci

Sylo



Avatar
TroXsA
Bonjour a tous

Si je peu me permettre Patrick Phippot
tester une URL ne veux pas dire forcement que la connexion a internet
existe, dans l'exemple ou si tu teste une url dont le site est Momentanément
hors service ton resultat sera alors erroné


Il existe un exmple d'Abelman (developpez.com)
_____________________________________________
Déclaration de l'API
Private Declare Function InternetGetConnectedState Lib "wininet.dll" ( _
ByRef lpdwFlags As Integer, _
ByVal dwReserved As Integer) As Boolean


' Utilisation de l'API
Public Function IsConnected() as Boolean
Dim Desc As Integer
return InternetGetConnectedState(Desc, 0)
End Function

___________________________________________
Sinon en version V2.0 framework c'est plus facile

Public Function internetOnOrOff()
Return My.Computer.Network.IsAvailable
End Function

--


Cordialement,

Site : http://www.troxsa.info
Mail : http://cerbermail.com/?rIXgaw9Xsl


"Patrick Philippot" a écrit dans le
message de news:
Bonjour,

Je ne pense pas qu'il y ait un moyen de faire ça en mode managé sauf à
tester directement l'accès à un URL donné.

Concernant les méthodes non managées, voir un résumé ici:

http://www.ndis.com/faq/QA05040101.htm

Personnellement, j'ai toujours eu des difficultés avec les APIs
"officielles" et j'utilise une méthode particulière mise au point d'après
une idée originale de Edwin Eefting et décrite dans cet article:

http://www.codeguru.com/cpp/i-n/internet/generalinternet/comments.php/c3437/?threadC800

Je n'ai jamais eu de souci avec ce code quel que soit le type de
connexion. Ce code peut s'adapter à n'importe quel langage.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


"Sylo" <devbnet[at]free.fr> wrote in message
news:%
Bonjour,

je dispose d'une application qui doit régulièrement vérifier si la
machine est connecté à internet.
Existe-t'il est objet dans le framework 1 ou 2 qui renvoi true si la
machine est connectée ou sinon false.
Je voudrais éviter de passer par des API

MErci

Sylo







Avatar
Patrick Philippot
Bonjour,

Si je peu me permettre Patrick Phippot
tester une URL ne veux pas dire forcement
que la connexion a internet existe, dans l'exemple ou si tu teste une url
dont le site est momentanément hors service ton resultat sera alors erroné



1. En général, on en teste plusieurs.

2. C'est bien pour cela que j'ai suggéré dans mon article cité en référence,
une autre méthode qui n'a pas l'inconvénient majeur du test direct: elle ne
provoque pas l'affichage de la boîte de dialogue dial-up si une connexion
n'est pas déjà établie.

Private Declare Function InternetGetConnectedState Lib "wininet.dll"



InternetGetConnectedState est connue pour donner des résultats incohérents
(je sais, j'ai testé pendant un bon bout de temps sur de nombreuses
configurations différentes).

Return My.Computer.Network.IsAvailable



Je n'ai pas encore testé Network.IsAvailable mais après désassemblage, j'ai
un gros doute. Ce code passe en revue tous les adaptateurs réseau présents
sur la machine et retourne vrai si pour au moins un d'entre eux, la
propriété NetworkInterface.OperationalStatus est Up. Ce qui signifie a
priori tout simplement que la carte réseau en question est connectée à... un
réseau. Mais cela n'indique en aucune manière qu'une connexion à Internet
soit disponible.

La méthode que je suggère (examen de la table de routage) permet de savoir
immédiatement s'il y a depuis la machine une passerelle disponible. Bien
sûr, il peut s'agir d'une passerelle sur Internet ou d'une passerelle sur un
autre réseau (cas fréquent dans l'entreprise). Mais au moins, on sait que
l'on a une connexion sur l'extérieur (sur autre chose que le réseau local).

Le fait que la passerelle soit disponible ne garantit pas contre un câble
débranché ou autre incident. C'est pour cela qu'en fait, la combinaison des
2 techniques est intéressante:

1. On vérifie si une passerelle existe.

2. Si elle n'existe pas, il est inutile d'aller plus loin. Pas de connexion
sur Internet.

3. Si elle existe, on peut tenter une requête sur un ou plusieurs URLs pour
vérifier que tout fonctionne correctement sans prendre le risque d'afficher
une boîte de dialogue dial-up.

Cette méthode me donne entière satisfaction et est actuellement utilisée sur
des centaines (voire des milliers) de configurations différentes de Win9x à
XP.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


"TroXsA" wrote in message
news:e63gpc$q4c$
Bonjour a tous

Si je peu me permettre Patrick Phippot
tester une URL ne veux pas dire forcement que la connexion a internet
existe, dans l'exemple ou si tu teste une url dont le site est
Momentanément hors service ton resultat sera alors erroné


Il existe un exmple d'Abelman (developpez.com)
_____________________________________________
Déclaration de l'API
Private Declare Function InternetGetConnectedState Lib "wininet.dll" ( _
ByRef lpdwFlags As Integer, _
ByVal dwReserved As Integer) As Boolean


' Utilisation de l'API
Public Function IsConnected() as Boolean
Dim Desc As Integer
return InternetGetConnectedState(Desc, 0)
End Function

___________________________________________
Sinon en version V2.0 framework c'est plus facile

Public Function internetOnOrOff()
Return My.Computer.Network.IsAvailable
End Function

--


Cordialement,

Site : http://www.troxsa.info
Mail : http://cerbermail.com/?rIXgaw9Xsl


"Patrick Philippot" a écrit dans le
message de news:
Bonjour,

Je ne pense pas qu'il y ait un moyen de faire ça en mode managé sauf à
tester directement l'accès à un URL donné.

Concernant les méthodes non managées, voir un résumé ici:

http://www.ndis.com/faq/QA05040101.htm

Personnellement, j'ai toujours eu des difficultés avec les APIs
"officielles" et j'utilise une méthode particulière mise au point d'après
une idée originale de Edwin Eefting et décrite dans cet article:

http://www.codeguru.com/cpp/i-n/internet/generalinternet/comments.php/c3437/?threadC800

Je n'ai jamais eu de souci avec ce code quel que soit le type de
connexion. Ce code peut s'adapter à n'importe quel langage.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


"Sylo" <devbnet[at]free.fr> wrote in message
news:%
Bonjour,

je dispose d'une application qui doit régulièrement vérifier si la
machine est connecté à internet.
Existe-t'il est objet dans le framework 1 ou 2 qui renvoi true si la
machine est connectée ou sinon false.
Je voudrais éviter de passer par des API

MErci

Sylo











Avatar
Sylo
Ton approche me parait interessante
Par contre, je ne comprend comment ré-exploiter le code dont tu me file le
lien.
Aurait tu le détail de la routine en c# ou mieux, en VB
Merci en tout cas pour ton aide car cela fait un moment que je cherche une
solution viable sur tous les systèmes
Sylo

"Patrick Philippot" a écrit dans le
message de news:
Bonjour,

Je ne pense pas qu'il y ait un moyen de faire ça en mode managé sauf à
tester directement l'accès à un URL donné.

Concernant les méthodes non managées, voir un résumé ici:

http://www.ndis.com/faq/QA05040101.htm

Personnellement, j'ai toujours eu des difficultés avec les APIs
"officielles" et j'utilise une méthode particulière mise au point d'après
une idée originale de Edwin Eefting et décrite dans cet article:

http://www.codeguru.com/cpp/i-n/internet/generalinternet/comments.php/c3437/?threadC800

Je n'ai jamais eu de souci avec ce code quel que soit le type de
connexion. Ce code peut s'adapter à n'importe quel langage.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


"Sylo" <devbnet[at]free.fr> wrote in message
news:%
Bonjour,

je dispose d'une application qui doit régulièrement vérifier si la
machine est connecté à internet.
Existe-t'il est objet dans le framework 1 ou 2 qui renvoi true si la
machine est connectée ou sinon false.
Je voudrais éviter de passer par des API

MErci

Sylo







Avatar
Patrick Philippot
Bonjour,

Bien, depuis le temps qu'on me demande de porter ça en VB, il faut bien que
je m'y mette... :-)

Tout d'abord faire un

Imports System.Runtime.InteropServices

Déclarer ensuite les structures nécessaires:

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDROW
Public dwForwardDest As System.UInt32
Public dwForwardMask As System.UInt32
Public dwForwardPolicy As System.UInt32
Public dwForwardNextHop As System.UInt32
Public dwForwardIfIndex As System.UInt32
Public dwForwardType As System.UInt32
Public dwForwardProto As System.UInt32
Public dwForwardAge As System.UInt32
Public dwForwardNextHopAS As System.UInt32
Public dwForwardMetric1 As System.UInt32
Public dwForwardMetric2 As System.UInt32
Public dwForwardMetric3 As System.UInt32
Public dwForwardMetric4 As System.UInt32
Public dwForwardMetric5 As System.UInt32
End Structure

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDTABLE
Public dwNumEntries As System.UInt32
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValArray)>
_
Public table() As MIB_IPFORWARDROW
End Structure

Vient ensuite la fonction de test:

Faire l'import nécessaire:

<DllImport("iphlpapi.dll")> _
Public Shared Function GetIpForwardTable( _
ByRef pIpForwardTable As MIB_IPFORWARDTABLE _
, ByRef pdwSize As System.UInt32 _
, ByVal bOrder As System.UInt32 _
) As System.UInt32
End Function

et définir la fonction

Public Function CheckConnection() As Boolean
Dim pft As MIB_IPFORWARDTABLE = Nothing
Dim dwTableSize As Integer
Dim bHasDefaultRoute As Boolean = False

GetIpForwardTable(pft, dwTableSize, 0)

Dim ptr As IntPtr = Marshal.AllocHGlobal(dwTableSize)
Marshal.StructureToPtr(pft, ptr, True)

If GetIpForwardTable(pft, dwTableSize, 1) = 0 Then
For nIndex As UInteger = 0 To pft.dwNumEntries - 1
If pft.table(nIndex).dwForwardDest = 0 Then
bHasDefaultRoute = True
Exit For
End If
Next
End If
Return bHasDefaultRoute
End Function

La fonction retourn VRAI si une passerelle ets disponible.

Voilà. D'après mes premiers tests, ça fonctionne correctement.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Re,

Il y a un problème d'indexation sur ce code. Ça ne fonctionne que si la
passerelle est déclarée dans la première entrée de la table. Je vais
remonter un fix.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


"Patrick Philippot" wrote in message
news:
Bonjour,

Bien, depuis le temps qu'on me demande de porter ça en VB, il faut bien
que je m'y mette... :-)

Tout d'abord faire un

Imports System.Runtime.InteropServices

Déclarer ensuite les structures nécessaires:

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDROW
Public dwForwardDest As System.UInt32
Public dwForwardMask As System.UInt32
Public dwForwardPolicy As System.UInt32
Public dwForwardNextHop As System.UInt32
Public dwForwardIfIndex As System.UInt32
Public dwForwardType As System.UInt32
Public dwForwardProto As System.UInt32
Public dwForwardAge As System.UInt32
Public dwForwardNextHopAS As System.UInt32
Public dwForwardMetric1 As System.UInt32
Public dwForwardMetric2 As System.UInt32
Public dwForwardMetric3 As System.UInt32
Public dwForwardMetric4 As System.UInt32
Public dwForwardMetric5 As System.UInt32
End Structure

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDTABLE
Public dwNumEntries As System.UInt32

<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValArray)>
_
Public table() As MIB_IPFORWARDROW
End Structure

Vient ensuite la fonction de test:

Faire l'import nécessaire:

<DllImport("iphlpapi.dll")> _
Public Shared Function GetIpForwardTable( _
ByRef pIpForwardTable As MIB_IPFORWARDTABLE _
, ByRef pdwSize As System.UInt32 _
, ByVal bOrder As System.UInt32 _
) As System.UInt32
End Function

et définir la fonction

Public Function CheckConnection() As Boolean
Dim pft As MIB_IPFORWARDTABLE = Nothing
Dim dwTableSize As Integer
Dim bHasDefaultRoute As Boolean = False

GetIpForwardTable(pft, dwTableSize, 0)

Dim ptr As IntPtr = Marshal.AllocHGlobal(dwTableSize)
Marshal.StructureToPtr(pft, ptr, True)

If GetIpForwardTable(pft, dwTableSize, 1) = 0 Then
For nIndex As UInteger = 0 To pft.dwNumEntries - 1
If pft.table(nIndex).dwForwardDest = 0 Then
bHasDefaultRoute = True
Exit For
End If
Next
End If
Return bHasDefaultRoute
End Function

La fonction retourn VRAI si une passerelle ets disponible.

Voilà. D'après mes premiers tests, ça fonctionne correctement.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr



Avatar
Patrick Philippot
[REPOST - Annule et remplace le message précédent]

Bonjour,

Bien, depuis le temps qu'on me demande de porter ça en VB, il faut bien que
je m'y mette... :-)

Tout d'abord faire un

Imports System.Runtime.InteropServices

Déclarer ensuite les structures nécessaires:

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDROW
Public dwForwardDest As System.UInt32
Public dwForwardMask As System.UInt32
Public dwForwardPolicy As System.UInt32
Public dwForwardNextHop As System.UInt32
Public dwForwardIfIndex As System.UInt32
Public dwForwardType As System.UInt32
Public dwForwardProto As System.UInt32
Public dwForwardAge As System.UInt32
Public dwForwardNextHopAS As System.UInt32
Public dwForwardMetric1 As System.UInt32
Public dwForwardMetric2 As System.UInt32
Public dwForwardMetric3 As System.UInt32
Public dwForwardMetric4 As System.UInt32
Public dwForwardMetric5 As System.UInt32
End Structure

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDTABLE
Public dwNumEntries As System.UInt32
<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValArray)>
_
Public table() As MIB_IPFORWARDROW
End Structure

Vient ensuite la fonction de test:

Faire l'import nécessaire:

<DllImport("iphlpapi.dll")> _
Public Shared Function GetIpForwardTable( _
ByRef pIpForwardTable As MIB_IPFORWARDTABLE _
, ByRef pdwSize As System.UInt32 _
, ByVal bOrder As System.UInt32 _
) As System.UInt32
End Function

et définir la fonction

Public Function CheckConnection() As Boolean
Dim pft As MIB_IPFORWARDTABLE = Nothing
Dim ptr As IntPtr = Nothing
Dim dwTableSize As Integer
Dim bHasDefaultRoute As Boolean = False
GetIpForwardTable(Nothing, dwTableSize, 0)
ptr = Marshal.AllocHGlobal(dwTableSize)
pft = CType(Marshal.PtrToStructure(ptr, GetType(MIB_IPFORWARDTABLE)),
MIB_IPFORWARDTABLE)

If GetIpForwardTable(pft, dwTableSize, 1) = 0 Then
bHasDefaultRoute = (pft.table(0).dwForwardDest = 0)
End If
Return bHasDefaultRoute
End Function

La fonction retourne VRAI si une passerelle ets disponible.

Quelques explications sur la suppression de la boucle de parcours de la
table. Le troisième argument de GetIpForwardTable indique que l'on désire un
résultat trié dans l'ordre croissant des adresses. Donc il suffit d'examiner
la première entrée seulement. Si il y a une passerelle active, elle sera
stockée dans la première entrée, sinon, la première entrée aura une valeur
non nulle dans dwForwardDest. C'est une simplification par rapport au code
C++ de mon article et cela permet d'éviter des manipulations pénibles à
cause du fait que la structure MIB_IPFORWARDTABLE ets de taille variable.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr
Avatar
Patrick Philippot
Un Marshal.FreeHGlobal( ptr ) à la fin de la fonction ne serait pas de trop
non plus :-)) .

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


"Patrick Philippot" wrote in message
news:
[REPOST - Annule et remplace le message précédent]

Bonjour,

Bien, depuis le temps qu'on me demande de porter ça en VB, il faut bien
que je m'y mette... :-)

Tout d'abord faire un

Imports System.Runtime.InteropServices

Déclarer ensuite les structures nécessaires:

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDROW
Public dwForwardDest As System.UInt32
Public dwForwardMask As System.UInt32
Public dwForwardPolicy As System.UInt32
Public dwForwardNextHop As System.UInt32
Public dwForwardIfIndex As System.UInt32
Public dwForwardType As System.UInt32
Public dwForwardProto As System.UInt32
Public dwForwardAge As System.UInt32
Public dwForwardNextHopAS As System.UInt32
Public dwForwardMetric1 As System.UInt32
Public dwForwardMetric2 As System.UInt32
Public dwForwardMetric3 As System.UInt32
Public dwForwardMetric4 As System.UInt32
Public dwForwardMetric5 As System.UInt32
End Structure

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDTABLE
Public dwNumEntries As System.UInt32

<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValArray)>
_
Public table() As MIB_IPFORWARDROW
End Structure

Vient ensuite la fonction de test:

Faire l'import nécessaire:

<DllImport("iphlpapi.dll")> _
Public Shared Function GetIpForwardTable( _
ByRef pIpForwardTable As MIB_IPFORWARDTABLE _
, ByRef pdwSize As System.UInt32 _
, ByVal bOrder As System.UInt32 _
) As System.UInt32
End Function

et définir la fonction

Public Function CheckConnection() As Boolean
Dim pft As MIB_IPFORWARDTABLE = Nothing
Dim ptr As IntPtr = Nothing
Dim dwTableSize As Integer
Dim bHasDefaultRoute As Boolean = False
GetIpForwardTable(Nothing, dwTableSize, 0)
ptr = Marshal.AllocHGlobal(dwTableSize)
pft = CType(Marshal.PtrToStructure(ptr, GetType(MIB_IPFORWARDTABLE)),
MIB_IPFORWARDTABLE)

If GetIpForwardTable(pft, dwTableSize, 1) = 0 Then
bHasDefaultRoute = (pft.table(0).dwForwardDest = 0)
End If
Return bHasDefaultRoute
End Function

La fonction retourne VRAI si une passerelle ets disponible.

Quelques explications sur la suppression de la boucle de parcours de la
table. Le troisième argument de GetIpForwardTable indique que l'on désire
un résultat trié dans l'ordre croissant des adresses. Donc il suffit
d'examiner la première entrée seulement. Si il y a une passerelle active,
elle sera stockée dans la première entrée, sinon, la première entrée aura
une valeur non nulle dans dwForwardDest. C'est une simplification par
rapport au code C++ de mon article et cela permet d'éviter des
manipulations pénibles à cause du fait que la structure MIB_IPFORWARDTABLE
ets de taille variable.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr



Avatar
Sylo
Ok merci
je vais tester cela
Sylo

"Patrick Philippot" a écrit dans le
message de news:
Un Marshal.FreeHGlobal( ptr ) à la fin de la fonction ne serait pas de
trop non plus :-)) .

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


"Patrick Philippot" wrote in message
news:
[REPOST - Annule et remplace le message précédent]

Bonjour,

Bien, depuis le temps qu'on me demande de porter ça en VB, il faut bien
que je m'y mette... :-)

Tout d'abord faire un

Imports System.Runtime.InteropServices

Déclarer ensuite les structures nécessaires:

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDROW
Public dwForwardDest As System.UInt32
Public dwForwardMask As System.UInt32
Public dwForwardPolicy As System.UInt32
Public dwForwardNextHop As System.UInt32
Public dwForwardIfIndex As System.UInt32
Public dwForwardType As System.UInt32
Public dwForwardProto As System.UInt32
Public dwForwardAge As System.UInt32
Public dwForwardNextHopAS As System.UInt32
Public dwForwardMetric1 As System.UInt32
Public dwForwardMetric2 As System.UInt32
Public dwForwardMetric3 As System.UInt32
Public dwForwardMetric4 As System.UInt32
Public dwForwardMetric5 As System.UInt32
End Structure

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDTABLE
Public dwNumEntries As System.UInt32

<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValArray)>
_
Public table() As MIB_IPFORWARDROW
End Structure

Vient ensuite la fonction de test:

Faire l'import nécessaire:

<DllImport("iphlpapi.dll")> _
Public Shared Function GetIpForwardTable( _
ByRef pIpForwardTable As MIB_IPFORWARDTABLE _
, ByRef pdwSize As System.UInt32 _
, ByVal bOrder As System.UInt32 _
) As System.UInt32
End Function

et définir la fonction

Public Function CheckConnection() As Boolean
Dim pft As MIB_IPFORWARDTABLE = Nothing
Dim ptr As IntPtr = Nothing
Dim dwTableSize As Integer
Dim bHasDefaultRoute As Boolean = False
GetIpForwardTable(Nothing, dwTableSize, 0)
ptr = Marshal.AllocHGlobal(dwTableSize)
pft = CType(Marshal.PtrToStructure(ptr, GetType(MIB_IPFORWARDTABLE)),
MIB_IPFORWARDTABLE)

If GetIpForwardTable(pft, dwTableSize, 1) = 0 Then
bHasDefaultRoute = (pft.table(0).dwForwardDest = 0)
End If
Return bHasDefaultRoute
End Function

La fonction retourne VRAI si une passerelle ets disponible.

Quelques explications sur la suppression de la boucle de parcours de la
table. Le troisième argument de GetIpForwardTable indique que l'on désire
un résultat trié dans l'ordre croissant des adresses. Donc il suffit
d'examiner la première entrée seulement. Si il y a une passerelle active,
elle sera stockée dans la première entrée, sinon, la première entrée aura
une valeur non nulle dans dwForwardDest. C'est une simplification par
rapport au code C++ de mon article et cela permet d'éviter des
manipulations pénibles à cause du fait que la structure
MIB_IPFORWARDTABLE ets de taille variable.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr







Avatar
Patrick Philippot
Une variante possible si l'on tient à utiliser une boucle au cas où l'on
aurait pas confiance dans le tri fait par GetIpForwardTable

1. Modifier la déclaration de la fonction comme suit:

<DllImport("iphlpapi.dll")> _
Public Shared Function GetIpForwardTable( _
ByVal pIpForwardTable As IntPtr _ <<<<<<<
, ByRef pdwSize As System.UInt32 _
, ByVal bOrder As System.UInt32 _
) As System.UInt32
End Function

2. Déclarer CheckConnection comme suit:

Public Function CheckConnection() As Boolean
Dim ptr As IntPtr
Dim dwTableSize As Integer
Dim bHasDefaultRoute As Boolean = False

GetIpForwardTable(Nothing, dwTableSize, 0)
ptr = Marshal.AllocHGlobal(dwTableSize)

If GetIpForwardTable(ptr, dwTableSize, 1) = 0 Then
Dim RowSize As Integer = Marshal.SizeOf(GetType(MIB_IPFORWARDROW))
Dim TableOffset As Integer =
CInt(Marshal.OffsetOf(GetType(MIB_IPFORWARDTABLE), "Table"))
Dim NumEntries As System.UInt32 = Marshal.ReadInt32(ptr, 0)

For nIndex As Integer = 0 To NumEntries - 1
Dim Row As MIB_IPFORWARDROW
Dim Entry As IntPtr = New IntPtr(ptr.ToInt32 + TableOffset +
(nIndex * RowSize))

Row = CType(Marshal.PtrToStructure(Entry,
GetType(MIB_IPFORWARDROW)), MIB_IPFORWARDROW)
If Row.dwForwardDest = 0 Then
bHasDefaultRoute = True
Exit For
End If
Next
End If

Return bHasDefaultRoute
End Function

Cette version peut servir si l'on veut examiner autre chose que
dwForwardDest pour tester la connexion.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


"Sylo" <devbnet[at]free.fr> wrote in message
news:
Ok merci
je vais tester cela
Sylo

"Patrick Philippot" a écrit dans le
message de news:
Un Marshal.FreeHGlobal( ptr ) à la fin de la fonction ne serait pas de
trop non plus :-)) .

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr


"Patrick Philippot" wrote in message
news:
[REPOST - Annule et remplace le message précédent]

Bonjour,

Bien, depuis le temps qu'on me demande de porter ça en VB, il faut bien
que je m'y mette... :-)

Tout d'abord faire un

Imports System.Runtime.InteropServices

Déclarer ensuite les structures nécessaires:

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDROW
Public dwForwardDest As System.UInt32
Public dwForwardMask As System.UInt32
Public dwForwardPolicy As System.UInt32
Public dwForwardNextHop As System.UInt32
Public dwForwardIfIndex As System.UInt32
Public dwForwardType As System.UInt32
Public dwForwardProto As System.UInt32
Public dwForwardAge As System.UInt32
Public dwForwardNextHopAS As System.UInt32
Public dwForwardMetric1 As System.UInt32
Public dwForwardMetric2 As System.UInt32
Public dwForwardMetric3 As System.UInt32
Public dwForwardMetric4 As System.UInt32
Public dwForwardMetric5 As System.UInt32
End Structure

<Runtime.InteropServices.StructLayout(Runtime.InteropServices.LayoutKind.Sequential,
Pack:=4)> _
Public Structure MIB_IPFORWARDTABLE
Public dwNumEntries As System.UInt32

<Runtime.InteropServices.MarshalAs(Runtime.InteropServices.UnmanagedType.ByValArray)>
_
Public table() As MIB_IPFORWARDROW
End Structure

Vient ensuite la fonction de test:

Faire l'import nécessaire:

<DllImport("iphlpapi.dll")> _
Public Shared Function GetIpForwardTable( _
ByRef pIpForwardTable As MIB_IPFORWARDTABLE _
, ByRef pdwSize As System.UInt32 _
, ByVal bOrder As System.UInt32 _
) As System.UInt32
End Function

et définir la fonction

Public Function CheckConnection() As Boolean
Dim pft As MIB_IPFORWARDTABLE = Nothing
Dim ptr As IntPtr = Nothing
Dim dwTableSize As Integer
Dim bHasDefaultRoute As Boolean = False
GetIpForwardTable(Nothing, dwTableSize, 0)
ptr = Marshal.AllocHGlobal(dwTableSize)
pft = CType(Marshal.PtrToStructure(ptr, GetType(MIB_IPFORWARDTABLE)),
MIB_IPFORWARDTABLE)

If GetIpForwardTable(pft, dwTableSize, 1) = 0 Then
bHasDefaultRoute = (pft.table(0).dwForwardDest = 0)
End If
Return bHasDefaultRoute
End Function

La fonction retourne VRAI si une passerelle ets disponible.

Quelques explications sur la suppression de la boucle de parcours de la
table. Le troisième argument de GetIpForwardTable indique que l'on
désire un résultat trié dans l'ordre croissant des adresses. Donc il
suffit d'examiner la première entrée seulement. Si il y a une passerelle
active, elle sera stockée dans la première entrée, sinon, la première
entrée aura une valeur non nulle dans dwForwardDest. C'est une
simplification par rapport au code C++ de mon article et cela permet
d'éviter des manipulations pénibles à cause du fait que la structure
MIB_IPFORWARDTABLE ets de taille variable.

--
Patrick Philippot - Microsoft MVP
MainSoft Consulting Services
www.mainsoft.fr











1 2