Dans ce tutoriel, nous allons apprendre à utiliser le service DNS (Domaine Name System), pour retrouver une adresse IP à partir d'un nom de machine et inversement. Ce tutoriel est donc en deux parties: l'une pour expliquer comment retrouver l'adresse IP à partir d'un nom de machine, et l'autre pour faire l'inverse :o)
Ici, comme pour la leçon précédente sur le PING, nous n'avons pas besoin du contrôle Winsock, car nous allons utiliser les fonctions internes des librairies DLL de Windows.
OptionExplicit'Déclaration des constantesPublicConst IP_SUCCESS AsLong=0PublicConst MAX_WSADescription AsLong=256PublicConst MAX_WSASYSStatus AsLong=128PublicConst WS_VERSION_REQD AsLong=&H101
PublicConst WS_VERSION_MAJOR AsLong= WS_VERSION_REQD \&H100 And&HFF&PublicConst WS_VERSION_MINOR AsLong= WS_VERSION_REQD And&HFF&PublicConst MIN_SOCKETS_REQD AsLong=1PublicConst SOCKET_ERROR AsLong=-1'Déclaration du type de données WinsockPublicType WSADATA
wVersion AsInteger
wHighVersion AsIntegerszDescription(0To MAX_WSADescription) As Byte
szSystemStatus(0To MAX_WSASYSStatus) As Byte
wMaxSockets AsLong
wMaxUDPDG AsLong
dwVendorInfo AsLongEndType'La fonction de résolutions d'adresses DNS appellée'GetHostByName fait partie de la librairie Wsock32.dllPrivateDeclareFunction gethostbyname Lib"wsock32" _
(ByVal hostname AsString) AsLong'declaration des procedures auxilliaresPrivateDeclareSub CopyMemory Lib"kernel32" _
Alias "RtlMoveMemory" _
(xDest As Any, _
xSource As Any, _
ByVal nbytes AsLong)
PrivateDeclareFunction lstrlenA Lib"kernel32" _
(lpString As Any) AsLongPublicDeclareFunction WSAStartup Lib"wsock32" _
(ByVal wVersionRequired AsLong, _
lpWSADATA As WSADATA) AsLong'Procedure de nettoyage des socketsPublicDeclareFunction WSACleanup Lib"wsock32"() AsLong'Routine d'initialisation du socketPublicFunctionSocketsInitialize() AsBooleanDim WSAD As WSADATA
Dim success AsLong
SocketsInitialize =WSAStartup(WS_VERSION_REQD, WSAD) = IP_SUCCESS
EndFunction'routine de nettoyage du socket retournant une msg d'erreur si 'necessairePublicSubSocketsCleanup()
IfWSACleanup() <>0ThenMsgBox"Une erreur à eu lieu lors de la fermeture.", vbExclamationEndIfEndSub'Cette fonction est en faite celle qu'on va appeller à chaque fois pour 'résoudre un nom (passé en tant que String) et qui va nous retourner 'une adresse IP (en String également)PublicFunctionGetIPFromHostName(ByVal sHostName AsString) AsString'Conversion du nom d'hote en adresse IPDim nbytes AsLongDim ptrHosent AsLongDim ptrName AsLongDim ptrAddress AsLongDim ptrIPAddress AsLongDim sAddress AsString
sAddress =Space$(4)
ptrHosent =gethostbyname(sHostName &vbNullChar)
If ptrHosent <>0Then'la fonction gethostbyname nous retourne un POINTEUR vers la structure 'HOSENT en mémoire. On va recopier l'adresse IP en mémoire, qui 'commence 12 octets après le début de la structure
ptrAddress = ptrHosent +12'get the IP address
CopyMemory ptrAddress, ByVal ptrAddress, 4
CopyMemory ptrIPAddress, ByVal ptrAddress, 4
CopyMemory ByVal sAddress, ByVal ptrIPAddress, 4
GetIPFromHostName =IPToText(sAddress)
EndIfEndFunction'Cette fonction sert à transformer la structure retrouvée d'une adresse 'IP (char x 4) en String du type "123.123.123.123"PrivateFunctionIPToText(ByVal IPAddress AsString) AsString
IPToText =CStr(Asc(IPAddress)) &"."& _
CStr(Asc(Mid$(IPAddress, 2, 1))) &"."& _
CStr(Asc(Mid$(IPAddress, 3, 1))) &"."& _
CStr(Asc(Mid$(IPAddress, 4, 1)))
EndFunction'----------fin du code module
OK. Maintenant, ajoutez un formulaire. Mettez-y deux champs de texte (Text1 et Text2) et un bouton de commande (Command1). Disposez-le comme suit et mettez la propriété Enabled de Text2 à False
PrivateSubCommand1_Click()
Dim sHostName AsStringIfSocketsInitialize() Then'si socket initialisé avec succès'on appelle notre fonction
sHostName = Text1.Text
Text2.Text=GetIPFromHostName(sHostName)
SocketsCleanup 'on nettoie le bazar...Else'GROS pb système (DLL absente, corrompue etc...)MsgBox"Windows Sockets for 32 bit Windows "& _
"ne répond pas. Vérifiez votre installation."EndIfEndSub
Voilà, c'est tout. Tapez un nom de machine (e.g. w3.org) dans Text1 et cliquez sur le bouton. L'adresse IP s'affichera alors.
2. Retrouver le nom de la machine à partir de l'adresse IP▲
L'opération inverse, à savoir retrouver un nom de machine à partir de l'adresse IP, est légèrement plus compliquée, mais repose néanmoins sur les mêmes principes:
Créez un projet VB et ajoutez-y un module standard.