Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

ADRESSE IP PAR L'API WINSOCK


Information sur la source

Catégorie :API Niveau : Expert Date de création : 19/01/2003 Date de mise à jour : 19/01/2003 15:18:22 Vu : 12 117

Note :
8,44 / 10 - par 9 personnes
8,44 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (31)
Ajouter un commentaire et/ou une note

Description

La question etant souvent posé et les sources de vbfrance introuvable, voici une version pour un module. Ca fait partie d'un de mes Projets.
 

Source

  • '---------------------------------
  • ' Ip INTERNET
  • ' TheSaib pour Codes-sources.com
  • ' Copyright Codes-sources.Com
  • ' modIP.bas
  • '---------------------------------
  • 'MsgBox Ip_courante(True)
  • Public Const WS_VERSION_REQD = &H101 'version nécessaire
  • Public Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF& 'version la + haute
  • Public Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF& 'version la + petite
  • Public Const MIN_SOCKETS_REQD = 1 'Min de socket
  • Public Const SOCKET_ERROR = -1 'Error d'initialisation socket
  • Public Const WSADESCRIPTION_LEN = 256 'Longueur du champs description
  • Public Const WSASYS_Status_Len = 128 'Idem champs status
  • Public Type HOSTENT 'Enregistre info relatif a un poste ou un réseau
  • hName As Long 'Pointeur vers le domaine de la machine
  • hAliases As Long 'Pointeur vers le domaine alternatif si il y a
  • hAddrType As Integer 'famille d'adresse utilisé par le protocole
  • hLength As Integer 'longueur en octetde chaque adresse pointé par hAddrType
  • hAddrList As Long 'list des adresse
  • End Type
  • 'type winsock
  • Public Type WSADATA 'utilsé par startup
  • wVersion As Integer 'version Winsock
  • wHighVersion As Integer 'Version la + haute de wsk que Win supporte
  • szDescription(0 To WSADESCRIPTION_LEN) As Byte 'Implémentation de winsok qui sera utilisé (doit finir par zero)
  • szSystemStatus(0 To WSASYS_Status_Len) As Byte 'statut implémentation actuell winsock
  • iMaxSockets As Integer 'nombre maximum de socket possible (32327)
  • iMaxUdpDg As Integer 'pas usé
  • lpszVendorInfo As Long ' pas usé
  • End Type
  • Public Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long 'Récupération erreur lié socket
  • Public Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired&, lpWSAData As WSADATA) As Long 'Initialise socket
  • Public Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long 'Destructeur de socket
  • Public Declare Function gethostname Lib "WSOCK32.DLL" (ByVal hostname$, ByVal HostLen As Long) As Long 'Récupere nom host
  • Public Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal hostname$) As Long 'Recupere ip a partir host
  • Public Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As Any, ByVal hpvSource&, ByVal cbCopy&)
  • Function BitPdsFort(ByVal Valeur As Integer) 'Récupère bit de poid fort du parametre
  • BitPdsFort = Valeur \ &H100 And &HFF& 'Et bit a bit
  • End Function
  • Function BitPdsFaible(ByVal Valeur As Integer) 'Récupère bit de poid faible du parametre
  • BitPdsFaible = Valeur And &HFF& 'Et bit a bit
  • End Function
  • Sub Init_socket() 'Initialisation des sockets
  • Dim WSAD As WSADATA 'pointeur vers objet wsk
  • Dim DemarrSck As Integer 'Valeur du démarrage d'un socket wsk
  • Dim sBitFaible As String, sBitFort As String, sMsg As String
  • DemarrSck = WSAStartup(WS_VERSION_REQD, WSAD) 'Initialisation Socket
  • 'Test Erreur d'init socket
  • If DemarrSck <> 0 Then
  • MsgBox "Erreur Winsock.dll."
  • Exit Sub
  • End If
  • 'Test si version nécessaire est indisponible
  • If BitPdsFaible(WSAD.wVersion) < WS_VERSION_MAJOR Or (BitPdsFaible(WSAD.wVersion) = _
  • WS_VERSION_MAJOR And BitPdsFort(WSAD.wVersion) < WS_VERSION_MINOR) Then
  • sBitFort = Trim$(Str$(BitPdsFort(WSAD.wVersion)))
  • sBitFaible = Trim$(Str$(BitPdsFaible(WSAD.wVersion)))
  • sMsg = "Windows Sockets version : " & sBitFaible & "." & sBitFort
  • MsgBox sMsg
  • Exit Sub
  • End If
  • End Sub
  • Public Function Ip_courante(RetourIPExterne As Boolean)
  • Init_socket
  • Dim hostname As String * 256 'Nom de la machine étendu de 0
  • Dim host_adresse As Long 'Adresse machine
  • Dim host As HOSTENT 'Type machine
  • Dim Adresse_ip_host As Long 'Adresse IP
  • Dim Adresse_ip_temporaire() As Byte 'Quartet temporaire
  • Dim i As Integer
  • Dim Adresse_ip As String 'Adresse ip de retour
  • Dim Ip As String
  • 'Recupere le nom de la machine
  • If gethostname(hostname, 256) = SOCKET_ERROR Then
  • MsgBox Err.Number
  • Exit Function
  • Else
  • hostname = Trim$(hostname)
  • End If
  • 'Pointeur vers l'adresse
  • host_adresse = gethostbyname(hostname)
  • If host_adresse = 0 Then
  • MsgBox "Erreur de Winsock.dll"
  • Exit Function
  • End If
  • 'Récupération dans le tableau de l'adresse
  • RtlMoveMemory host, host_adresse, LenB(host)
  • RtlMoveMemory Adresse_ip_host, host.hAddrList, 4
  • 'Recupere les 4 quartets de l'adresse
  • Do
  • ReDim Adresse_ip_temporaire(1 To host.hLength)
  • RtlMoveMemory Adresse_ip_temporaire(1), Adresse_ip_host, host.hLength
  • 'Met en forme les quartets en @ Ip valide
  • For i = 1 To host.hLength
  • Adresse_ip = Adresse_ip & Adresse_ip_temporaire(i) & "."
  • Next
  • Adresse_ip = Mid$(Adresse_ip, 1, Len(Adresse_ip) - 1)
  • 'Copie de l'ip
  • Interne = Mon_IP
  • Externe = Adresse_ip
  • Mon_IP = Adresse_ip
  • Adresse_ip = ""
  • host.hAddrList = host.hAddrList + LenB(host.hAddrList)
  • RtlMoveMemory Adresse_ip_host, host.hAddrList, 4
  • Loop While (Adresse_ip_host <> 0)
  • If RetourIPExterne = True Then
  • Ip_courante = Externe
  • Else
  • Ip_courante = Interne
  • End If
  • End Function
  • Sub DestrucSocket()
  • Dim lretour As Long
  • lretour = WSACleanup()
  • If lretour <> 0 Then
  • MsgBox "Erreur socket" & Trim$(Str$(lretour)) & " pendant sa destruction "
  • Exit Sub
  • End If
  • End Sub
'---------------------------------
' Ip INTERNET
' TheSaib pour Codes-sources.com
' Copyright Codes-sources.Com
' modIP.bas
'---------------------------------

'MsgBox Ip_courante(True)

Public Const WS_VERSION_REQD = &H101 'version nécessaire
Public Const WS_VERSION_MAJOR = WS_VERSION_REQD \ &H100 And &HFF& 'version la + haute
Public Const WS_VERSION_MINOR = WS_VERSION_REQD And &HFF& 'version la + petite
Public Const MIN_SOCKETS_REQD = 1 'Min de socket
Public Const SOCKET_ERROR = -1 'Error d'initialisation socket
Public Const WSADESCRIPTION_LEN = 256 'Longueur du champs description
Public Const WSASYS_Status_Len = 128 'Idem champs status

Public Type HOSTENT 'Enregistre info relatif a un poste ou un réseau
    hName As Long 'Pointeur vers le domaine de la machine
    hAliases As Long 'Pointeur vers le domaine alternatif si il y a
    hAddrType As Integer 'famille d'adresse utilisé par le protocole
    hLength As Integer 'longueur en octetde chaque adresse pointé par hAddrType
    hAddrList As Long 'list des adresse
End Type

'type winsock
Public Type WSADATA 'utilsé par startup
    wVersion As Integer 'version Winsock
    wHighVersion As Integer 'Version la + haute de wsk que Win supporte
    szDescription(0 To WSADESCRIPTION_LEN) As Byte 'Implémentation de winsok qui sera utilisé (doit finir par zero)
    szSystemStatus(0 To WSASYS_Status_Len) As Byte 'statut implémentation actuell winsock
    iMaxSockets As Integer 'nombre maximum de socket possible (32327)
    iMaxUdpDg As Integer 'pas usé
    lpszVendorInfo As Long ' pas usé
End Type

Public Declare Function WSAGetLastError Lib "WSOCK32.DLL" () As Long 'Récupération erreur lié socket
Public Declare Function WSAStartup Lib "WSOCK32.DLL" (ByVal wVersionRequired&, lpWSAData As WSADATA) As Long 'Initialise socket
Public Declare Function WSACleanup Lib "WSOCK32.DLL" () As Long 'Destructeur de socket
Public Declare Function gethostname Lib "WSOCK32.DLL" (ByVal hostname$, ByVal HostLen As Long) As Long 'Récupere nom host
Public Declare Function gethostbyname Lib "WSOCK32.DLL" (ByVal hostname$) As Long 'Recupere ip a partir host
Public Declare Sub RtlMoveMemory Lib "kernel32" (hpvDest As Any, ByVal hpvSource&, ByVal cbCopy&)

Function BitPdsFort(ByVal Valeur As Integer) 'Récupère bit de poid fort du parametre
    BitPdsFort = Valeur \ &H100 And &HFF& 'Et bit a bit
End Function


Function BitPdsFaible(ByVal Valeur As Integer) 'Récupère bit de poid faible du parametre
    BitPdsFaible = Valeur And &HFF& 'Et bit a bit
End Function


Sub Init_socket() 'Initialisation des sockets
    Dim WSAD As WSADATA 'pointeur vers objet wsk
    Dim DemarrSck As Integer 'Valeur du démarrage d'un socket wsk
    Dim sBitFaible As String, sBitFort As String, sMsg As String
    DemarrSck = WSAStartup(WS_VERSION_REQD, WSAD) 'Initialisation Socket

    'Test Erreur d'init socket
    If DemarrSck <> 0 Then
        MsgBox "Erreur Winsock.dll."
        Exit Sub
    End If
    'Test si version nécessaire est indisponible
    If BitPdsFaible(WSAD.wVersion) < WS_VERSION_MAJOR Or (BitPdsFaible(WSAD.wVersion) = _
        WS_VERSION_MAJOR And BitPdsFort(WSAD.wVersion) < WS_VERSION_MINOR) Then
        sBitFort = Trim$(Str$(BitPdsFort(WSAD.wVersion)))
        sBitFaible = Trim$(Str$(BitPdsFaible(WSAD.wVersion)))
        sMsg = "Windows Sockets version : " & sBitFaible & "." & sBitFort
        MsgBox sMsg
        Exit Sub
    End If

End Sub

Public Function Ip_courante(RetourIPExterne As Boolean)
    Init_socket
    Dim hostname As String * 256 'Nom de la machine étendu de 0
    Dim host_adresse As Long 'Adresse machine
    Dim host As HOSTENT 'Type machine
    Dim Adresse_ip_host As Long 'Adresse IP
    Dim Adresse_ip_temporaire() As Byte 'Quartet temporaire
    Dim i As Integer
    Dim Adresse_ip As String 'Adresse ip de retour
    Dim Ip As String
    
    'Recupere le nom de la machine
    If gethostname(hostname, 256) = SOCKET_ERROR Then
                 MsgBox Err.Number
                 Exit Function
    Else
        hostname = Trim$(hostname)
    End If
    'Pointeur vers l'adresse
    host_adresse = gethostbyname(hostname)


    If host_adresse = 0 Then
        MsgBox "Erreur de Winsock.dll"
        Exit Function
    End If
    
    'Récupération dans le tableau de l'adresse
    RtlMoveMemory host, host_adresse, LenB(host)
    RtlMoveMemory Adresse_ip_host, host.hAddrList, 4
   
    'Recupere les 4 quartets de l'adresse
    Do
        ReDim Adresse_ip_temporaire(1 To host.hLength)
        RtlMoveMemory Adresse_ip_temporaire(1), Adresse_ip_host, host.hLength

        'Met en forme les quartets en @ Ip valide
        For i = 1 To host.hLength
            Adresse_ip = Adresse_ip & Adresse_ip_temporaire(i) & "."
        Next
        Adresse_ip = Mid$(Adresse_ip, 1, Len(Adresse_ip) - 1)
    
        'Copie de l'ip
        Interne = Mon_IP
        Externe = Adresse_ip
        Mon_IP = Adresse_ip
        
        

        Adresse_ip = ""
        host.hAddrList = host.hAddrList + LenB(host.hAddrList)
        RtlMoveMemory Adresse_ip_host, host.hAddrList, 4
    Loop While (Adresse_ip_host <> 0)
    
    
If RetourIPExterne = True Then
    Ip_courante = Externe
Else
    Ip_courante = Interne
End If
End Function

Sub DestrucSocket()
    Dim lretour As Long
    lretour = WSACleanup()


    If lretour <> 0 Then
        MsgBox "Erreur socket" & Trim$(Str$(lretour)) & " pendant sa destruction "
        Exit Sub
    End If
End Sub




Commentaires et avis

signaler à un administrateur
Commentaire de TheSaib le 19/01/2003 15:21:00 administrateur CS

Bient entendu a mettre dans un module ...
ET cela donne l'@ IP Externe ...

TheSaib

signaler à un administrateur
Commentaire de logisim le 19/01/2003 15:56:27

Tout ça pour trouver l'adresse IP ?

signaler à un administrateur
Commentaire de TheSaib le 19/01/2003 16:00:05 administrateur CS

Oui pour trouver l'ip externe (internet) lorsque tu as plusieurs controleurs réseau le bon winsock.localIP c pas terrible.
En plus de çà tout est en Api donc pas besoin de l'ocx de winsock.
Si tu as mieux je suis ouverts a toutes proposition constructive et intelligente.

signaler à un administrateur
Commentaire de slayer le 19/01/2003 16:18:32

heu , on faire comment pour faire appel a ce module ???

signaler à un administrateur
Commentaire de TheSaib le 19/01/2003 16:21:52 administrateur CS

c ecris en haut ex : msgbox ip_courante(true)

(Je suppose qd meme que tu as compris qu'il fallait copier/coller le code pour le mettre dans un fichier bas =

signaler à un administrateur
Commentaire de max12 le 19/01/2003 16:34:35 administrateur CS

Sa fonctionne donc même si t'a une passerelle .... ? (Par curiosité)

signaler à un administrateur
Commentaire de TheSaib le 19/01/2003 16:41:29 administrateur CS

Non :(
Je trouverais une solution pour çà :)

signaler à un administrateur
Commentaire de slayer le 19/01/2003 16:42:18

ok , merci pour l'info.

signaler à un administrateur
Commentaire de TheSaib le 19/01/2003 16:42:56 administrateur CS

C'est valable pour le cas ou tu es la passerelle

signaler à un administrateur
Commentaire de Nocturne le 21/01/2003 22:37:42

En réponse à max12 et TheSaib.

J'ai mis un exemple d'une de mes sources qui utilise l'API wininet et qui prend en charge les modems, routeur, passerelle, serveur proxy ou toutes autres systèmes de connexion à Internet.
Il fonctionne avec une page en PHP qui me renvoie mon IP.

La source est disponible : http://www.vbfrance.com/article.aspx?Val=7172

signaler à un administrateur
Commentaire de nanette261 le 29/01/2003 09:44:42

Je vois que tu t'y connais en IP.
J'aimerais savoir si à partir de mon poste, je peux utiliser des adresse IP différente pour des connections HTTP.
Le but est que le serveur qui recoit (User et Password) ne puissent pas vérifier la meme IP pour une autre connection.

signaler à un administrateur
Commentaire de TheSaib le 29/01/2003 14:10:51 administrateur CS

non pas possible. passe par un prowy web ca peut t'aider.

signaler à un administrateur
Commentaire de Rock le 03/02/2003 19:40:55

Merci pour ce module ca va m'etre utile.

signaler à un administrateur
Commentaire de bibiou le 09/06/2003 10:54:04

Super cette source !!!
Bon travail !!!

signaler à un administrateur
Commentaire de gluk le 29/09/2003 21:43:08

Super source,
trés utile.
Merci...

signaler à un administrateur
Commentaire de jnussy le 13/10/2003 15:58:31

Très bon boulot la prog API winsock, très pratique plutôt que la méthode barbare avec le controle WinSock.
Thx!

signaler à un administrateur
Commentaire de kiakia le 27/01/2004 13:00:20

Tres util et facile d'utilisation, marche impec :) je te remercie pour cette source qui m'a évité de chercher plus de 1 minute :p

signaler à un administrateur
Commentaire de ray2112 le 28/01/2004 17:38:21

g besoin d'un source ou une solution qui me permette de connaitre l'adresse IP de mon routeur
est il possible de le trouver et comment !!
merci de vos aides !!

signaler à un administrateur
Commentaire de Frank339 le 22/02/2004 23:53:08

ray2112 pour moi c simple c 192.168.1.1 essaye chez toi... :-)

signaler à un administrateur
Commentaire de TheSaib le 23/02/2004 00:45:28 administrateur CS

Il suffit que tu ailles sur un site qui te donne ton adresse IP,  si tu est derriere un routeur il te donnera l'adresse de ton routeur.

signaler à un administrateur
Commentaire de Frank339 le 23/02/2004 02:22:48

non... quand je tape 192.168.1.1 il me donne accès à mon menu du modem via ie je peux gérer le firewall, les ports, etc...

signaler à un administrateur
Commentaire de Mopii9 le 27/02/2005 17:10:23

marche pas ton truck vaut mieu faire winsock.localIP sa revient au meme. PS : j'ai un routeur

signaler à un administrateur
Commentaire de PCPT le 30/03/2005 13:26:32 administrateur CS

salut TheSaib
on ne peut obtenir que les adresses de son LAN, non?
je viens d'essayer, 2 postes sous XP, j'ai les adresses LAN, pas la WAN, même à partir de celui qui partage la connection (modem USB, donc sans routeur)...

par contre, en effet, c'est toujours bon dans la pratique sans l'OCX.
tite' question en passant : une idée quelqu'un?? ->  échange entre 2 personnes, par Winsock, le serveur écoute, mais justement, si il n'est pas le porteur du modem, il n'entendra jamais l'appel du client...

merci à bientôt
PCPT

signaler à un administrateur
Commentaire de guil2004 le 09/04/2005 18:20:12

cool cé justement ca que je cherchais
ca marche sous xb
good salut

signaler à un administrateur
Commentaire de gpl972 le 12/09/2005 17:15:40

as tu une solution pour retrouver l'adresse ip d'un utilisateur en Terminal Server.

signaler à un administrateur
Commentaire de duky2 le 01/10/2005 23:47:32

hello,

très intéressant ce code, par contre j'ai pas testé si ça marchait mais il y a un erreur dans la fonction Init_socket():
DemarrSck = WSAStartup(WS_VERSION_REQD, WSAD) 'Initialisation Socket

DemarrSck est une variable de type integer alors que la fonction WSAStartup retourne une valeur de type long.

signaler à un administrateur
Commentaire de vbPink le 08/08/2006 20:15:09

Tu dis que Winsock.LocalIP n'est pas terrible, mais il me donne la même réponse que ton code :X

signaler à un administrateur
Commentaire de marco62118 le 26/03/2009 22:23:37

bonsoir
je viens de tester ton code et il ne donne absolument pas l'adresse ip lorsqu'on est derrière un routeur la seule adresse qu'on obtienne c'est du type 192.168.0.xx

signaler à un administrateur
Commentaire de Renfield le 27/03/2009 06:05:55 administrateur CS

tu te méprends me semble il
ton ordinateur as une IP... tu la récupère bien.

ce que tu souhaites obtenir, c'est l'adresse IP de ton routeur, celle attribuée par ton FAI.

mais ca n'est pas la tienne, donc tu ne peux la récupérer pa ce biai.

le plus simple reste encore de demander l'adresse vue par l'exterieur, en se rendant sur un des dizaines de sites te proposant ce genre de service

signaler à un administrateur
Commentaire de marco62118 le 27/03/2009 18:38:35

c'est bien ce qui me semblait
donc le seul moyen c'est de se connecter à une page internet et en tirer l'adresse IP.
Cette méthode est génante car la page peut changer, plusieur internaute on proposé des codes avec ce principe et il se révéle défectueux car la page a changé!

signaler à un administrateur
Commentaire de Renfield le 28/03/2009 03:06:27 administrateur CS

y'a peut etre moyen de demander l'info au routeur, mais est-ce que tu auras un moyen simple et efficace sur tous les routeurs...

Ajouter un commentaire



Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,343 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.