cs_marco62118
Messages postés176Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention 1 avril 2013
-
11 avril 2009 à 22:54
cs_marco62118
Messages postés176Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention 1 avril 2013
-
13 avril 2009 à 11:36
Bonjour à tous
Dans ma recherche pour trouver l'adresse IP publique j'ai voulu utiliser l'API internetGetConnectedState mais dans la déclaration Private Declare Function InternetGetConnectedState Lib "wininet.dll" ( ByRef lpdwFlags As Integer, ByVal dwReserved As Integer) As Boolean
lpdwFlags retourne une valeur :
'INTERNET_CONNECTION_CONFIGURED:0x40. Local a un système de connexion à l'Internet, mais elle peut être ou ne pas être actuellement connecté.<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" /??>
'INTERNET_CONNECTION_LAN:0x02 Local système utilise un réseau local pour se connecter à l'Internet.
'INTERNET_CONNECTION_MODEM:0x01 Local système utilise un modem pour se connecter à l'Internet.
'INTERNET_CONNECTION_MODEM_BUSY: 0x08 N'est plus utilisé.
'INTERNET_CONNECTION_OFFLINE: 0x20 Local système est en mode hors connexion.
'INTERNET_CONNECTION_PROXY: 0x04 Local système utilise un serveur proxy pour se connecter à l'Internet.
Mais lorsque je fait l'essais sur ma connexion qui directement sur un modem ADSL j'ai en retour de valeur 81 un ami derrière un routeur à la valeur 18.
Donc je me pose la question pourquoi ces différences de valeurs? Et quelles sont les bonnes valeurs?
De plus dans mes recherches sur internet j'ai vu à plusieurs reprises reprendre ces valeurs mais de les vérifier d'une façon bizarre::
If (lpdwFlags And INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM Then….
Ou alors
If lpdwFlags And INTERNET_CONNECTION_MODEM Then….
Ici dans mon cas ça donne if (81 and 1)= 1 then … ou if 81 and 1 then
Cet api donne l'état de ta connexion Internet et ne te donnera jamais ton Ip publique
Les valeurs retournées dans lpdwFlags diffère selon ton mode de connexion au NET : c'est l'Api qui renvoie les valeurs et non toi qui les fixe
Par exemple :
If (lpdwFlags And INTERNET_CONNECTION_MODEM) = INTERNET_CONNECTION_MODEM Then.. : on fait un AND binaire sur 8 bits pour vérifier si notre connexion est derrière un modem
Dans ton cas if 10000001 and 00000001 = 00000001 then (en binaire)
81 and 1 = 1 then (en héxadécimal)
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
cs_marco62118
Messages postés176Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention 1 avril 20131 12 avril 2009 à 00:34
ok merci pour cet explication et doit on toujours faire ce genre de comparaison dans les api pour savoir si on a le bonnes valeur??
et pourquoi ma connexion par modem renvoi 81 et pas simplement 1??
je suis d'accord ça ne me donnera pas l'adresse IP, c'était une étape !
cs_marco62118
Messages postés176Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention 1 avril 20131 12 avril 2009 à 17:04
bonjour
j'ai pas compris Renfield ce que tu veux dire!? je suis preneur de plus d'infos!!!
j'ai accepté un peu rapidement la réponse car je ne comprends pas la comparaison binaire comment 10000001 and 00000001 peuvent ils être identique? le premier 1 de poids 0 de chaque valeur , je comprends 1 and 1=1 mias le 1 de poids 8 et le 0 de poids 8 commends peuvent ils donner 0 and 1= ???
comment savoir quels mode comparaison faire?
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_marco62118
Messages postés176Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention 1 avril 20131 12 avril 2009 à 17:57
rebonjour
pouvez vous me préciser quand on obtient INTERNET_CONNECTION_OFFLINE =H20 car quand je suis déconnecté j'ai tout de même la valeur cité plus haut 81 mais l'api renvois bien faux!
Tout d'abord les poids vont de 0 à 7
Le And se fait sur 8 bits avec les bits de poids identiques
lpdwFlags = 10000001 ou 81 héxa
INTERNET_CONNECTION_MODEM = 00000001 ou 01 héxa
AND entre ces 2 valeurs =00000001 ou 01 héxa
Etant donné que dans ces 2 valeurs seul le bit 0 est à 1 donc le AND donne 1 comme résultat
Dans ce cas on teste dans lpdwflags qui est la valeur renvoyée par l'Api si le bit 0 est à 1 ( si le bit indiquant si le paramètre INTERNET_CONNECTION_MODEM est positionné à 1)
La valeur INTERNET_CONNECTION_MODEM = 00000001 ou 01 héxa est souvent appelé un masque
Si on avait voulu tester si ce bit est à 0 on aurait utilisé 11111110 comme masque et on aurait fait un OR entre lpdwflags et 11111110
Quand à savoir quelle mode de comparaison effectuer ? Il faut connaitre l'Api et les paramètres qu'elle renvoie et savoir les utiliser et les interprèter.Il en est de même pour toutes les Apis de Windows
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.
cs_marco62118
Messages postés176Date d'inscriptionmercredi 7 avril 2004StatutMembreDernière intervention 1 avril 20131 12 avril 2009 à 20:25
j'ai bien compris il faut vérifier si le bit du "masque" correspond au bit de la valeur retournée
H81=10000001
H01=00000001 CONNEXION MODEM
-----------------
AND 1
H81=10000001
H40=10000000connexion à internet possible
-----------------
and 1
merci
la conversation dont tu fait référence ne me parait pas prouver que les valeurs renvoyées ne sont pas valables
Je cite notre ami Brunews d'après le post ci-dessus:
Il dit : "InternetGetConnectedState() ne donne absolument plus rien de valable
avec les connexions permanentes de type adsl + routeur et c'est devenu
le cas général."
"Une tentative de connexion est le seul moyen (ping
ou autre), peut-être pas de savoir à coup sur si on est connecté mais
au moins de tenter d'atteindre un site."
Ceci n'engage que lui mais connaissant son sérieux et son savoir cela vaut presque parole d'évangile
La théorie, c'est quand on sait tout et que rien ne fonctionne. La pratique, c'est quand tout fonctionne et que personne ne sait pourquoi.