Page 1 sur 1

[Func] Connaitre son adresse IP (internet)

Posté : mar. 15 juin 2010 17:04
par ZDS
Rebonjour,
Comme vous le savez, vous ne pouvez pas connaitre votre IP internet tout seul, il vous faut la demander à quelqu'un de l'autre "coté du mirroir", voici une fonction qui appelle simplement DynDNS (si vous ne faites pas confiance à ce site, je vois pas quoi faire ^^) :

Code : Tout sélectionner

Func getIP($timeOutMax = 2000)
    Local $resultat = "", $connexion, $url="http://checkip.dyndns.org/", $fichierTemp=@TempDir&"\~ip.log"
    $connexion = InetGet($url, $fichierTemp, 1, 1)
    Local $timeOut = $timeOutMax
    While $timeOut > 0 And Not InetGetInfo($connexion, 2)
        Sleep(250)
        $timeOut=$timeOut-250
    WEnd
    InetClose($connexion)
    If $timeOut > 0 Then
        Local $fichierHandle = FileOpen($fichierTemp, 0)
        If $fichierHandle <> -1 Then
            Local $contenu = FileRead($fichierHandle)
            If @error = 0 Then
                Local $resultatRegexp = StringRegExp($contenu, '<body>(?:.*?)(\d+.\d+.\d+.\d+)(?:\D?)(?:.*?)</body>', 3)
                If IsArray($resultatRegexp) And UBound($resultatRegexp) > 0 Then
                    If UBound($resultatRegexp) = 1 Then
                        $resultat = $resultatRegexp[0]
                    Else
                        $resultat = "Résultat ambigu"
                    EndIf
                Else
                    $resultat = "Résultat introuvable"
                EndIf
            Else
                $resultat = "Source illisible"
            EndIf
        Else
            $resultat = "Source introuvable"
        EndIf
        FileClose($fichierHandle)
    Else
        $resultat = "Délai dépassé"
    EndIf
    FileDelete($fichierTemp)
    Return $resultat
EndFunc
A bientôt !

Re: [Func] Connaitre son adresse IP (internet)

Posté : mar. 15 juin 2010 18:52
par Sh4dows
Pourquoi tous cela ?
Une fonction exista déjà :roll:

Code : Tout sélectionner

#include <INet.au3>
MsgBox(0, "IP", "Votre Adresse IP est : "&_GetIP())
 
C'est bien tu réinvente la roue lol !
La fonction existe déjà mais coder diferrement :lol:

Fonction de Inet.au3 :

Code : Tout sélectionner

; #FUNCTION# ====================================================================================================================
; Name...........: _GetIP
; Description ...: Get public IP address of a network/computer.
; Parameters ....: None
; Return values .: On Success - Returns the public IP Address
;                  On Failure - -1  and sets @ERROR = 1
; Author ........: Larry/Ezzetabi & Jarvis Stubblefield
; Remarks .......: Internet access.
; ===============================================================================================================================
Func _GetIP()
    Local $ip, $t_ip
    If InetGet("http://checkip.dyndns.org/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
        $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
        FileDelete(@TempDir & "\~ip.tmp")
        $ip = StringTrimLeft($ip, StringInStr($ip, ":") + 1)
        $ip = StringTrimRight($ip, StringLen($ip) - StringInStr($ip, "/") + 2)
        $t_ip = StringSplit($ip, '.')
        If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
            Return $ip
        EndIf
    EndIf
    If InetGet("http://www.whatismyip.com/?rnd1=" & Random(1, 65536) & "&rnd2=" & Random(1, 65536), @TempDir & "\~ip.tmp") Then
        $ip = FileRead(@TempDir & "\~ip.tmp", FileGetSize(@TempDir & "\~ip.tmp"))
        FileDelete(@TempDir & "\~ip.tmp")
        $ip = StringTrimLeft($ip, StringInStr($ip, "Your ip is") + 10)
        $ip = StringLeft($ip, StringInStr($ip, " ") - 1)
        $ip = StringStripWS($ip, 8)
        $t_ip = StringSplit($ip, '.')
        If $t_ip[0] = 4 And StringIsDigit($t_ip[1]) And StringIsDigit($t_ip[2]) And StringIsDigit($t_ip[3]) And StringIsDigit($t_ip[4]) Then
            Return $ip
        EndIf
    EndIf
    Return SetError(1, 0, -1)
EndFunc   ;==>_GetIP
 

Re: [Func] Connaitre son adresse IP (internet)

Posté : mar. 15 juin 2010 20:32
par ZDS
Chapeau, j'avais cette fonction dans un coin, et je ne savais pas qu'elle existait déjà...

Comment passer pour un con en un seul post :)

[EDIT] Quoi que, question algo, c'est pas 100% vérifié...

Re: [A EFFACER] Connaitre son adresse IP (internet)

Posté : mar. 15 juin 2010 21:11
par Sh4dows
Tu peux quand même laissé ton Post !
Pas besoin de mettre à effacer :roll: car ton code peux servir aux débutants.

Perso dans mes débuts en AutoIt j'étais "heureux" d'avoir des codes de programmes entier pour en apprendre d'avantage sur comment il fonctionnaientt etc... (Je raconte ma life je :arrow:)

Donc laisse ta fonction :wink:

Cordialement Sh4dows

Re: [A EFFACER] Connaitre son adresse IP (internet)

Posté : mar. 15 juin 2010 22:14
par timmalos
Je confirme, cette fonction restera là ou elle est :P
C'est comme ma fonction _InetGet2 qui ne sert a rien en tant que telle mais c'est instructif pour les débutants.

Re: [Func] Connaitre son adresse IP (internet)

Posté : mer. 16 juin 2010 16:48
par Karachi
Par contre, ta fonction est plus longue, environ cinq fois plus de temps sur mon ordinateur.

Re: [Func] Connaitre son adresse IP (internet)

Posté : mer. 16 juin 2010 17:36
par ZDS
Hello !

C'est normal que ce soit plus lent, pour plusieurs raisons voulues (et oui ^^) :
1 - La plupart du temps, quand on veut consulter son IP, c'est au cas où elle ait changé sans qu'on s'en soit rendu compte (reboot de la box, etc...), d'ou le premier 1 dans InetGet($url, $fichierTemp, 1, 1) qui oblige à recharger la page de DynDNS au lieu de prendre dans le cache (ce qui serait plus rapide la seconde/troisième/n-ième fois, mais donne pas forcément l'adresse actuelle).
2 - J'y ai ajouté un timeOut, pour qu'on puisse sortir de la fonction avant le chargement sur toutes les connexions, d'où la boucle While et le second 1 dans InetGet($url, $fichierTemp, 1, 1) (car si la connexion est lente genre un téléphone portable comme modem et qu'on a pas ce 1, la procédure fige le script le temps qu'on récupère la page, ce qui peut aller jusque 30 secondes voire une minute), donc ça augmente forcement le temps minimum de réponse, mais par contre réduit énormément le temps maximum de 30 à 2 secondes (pour tester, lance la fonction de base avec un proxy en rade ou une "connectivité limitée ou inexistante", puis lance celle là).
3 - J'utilise une RegExp comme "checkeur", au lieu de string split ou string between, ce qui prend plus de temps, mais est sans aucun doute beaucoup plus flexible : il suffirait que le blabla de DynDNS change pour que la fonction de base tombe en rade (par exemple plus d'espace entre l'IP et le reste du texte, ou un "." avant la fin du <body>), moins (pas aucune, mais moins) de chance pour la "mienne".

Donc si "ma" fonction est plus lente, ce n'est pas pour des besoins de performances, mais pour des soucis d'algorithmique (B-Method-like Powa! ^^).

A bientôt!