[R] Récuperer un nom netbios grace à une @ip - getnameinfo

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Répondre
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

[R] Récuperer un nom netbios grace à une @ip - getnameinfo

#1

Message par tatane »

Bonjour,

Il existe déjà des scripts permettant de scanner un réseau local et de récupérer les noms d'hôte des PC qui y sont connectés (cf : http://www.autoitscript.com/forum/topic ... p-scanner/). La fonction _TCPIpToName() le permet. Mais cette fonction utilise la fonction windows "gethostbyaddr" qui a super lente lorsque l'@ip scannée n'est pas accessible (retour entre 5 et 10s).
De ce que j'ai pu lire sur certains forums c/c++ (http://cboard.cprogramming.com/networki ... -slow.html) il semblerait que la fonction "getnameinfo" soit beaucoup plus rapide et théoriquement est censé remplacer "gethostbyaddr".

Malheureusement je suis incapable de l'utiliser avec AutoIt, c'est pourquoi je souhaiterais obtenir un exemple d'utilisation de cette dernière.

Merci par avance.
Cordialement.

Edit : Petite correction, en fait le retour est lent même lorsque l'ip est en ligne.
Modifié en dernier par tatane le mer. 15 mai 2013 13:48, modifié 6 fois.
Avatar du membre
GhostLine
Niveau 7
Niveau 7
Messages : 342
Enregistré le : jeu. 12 mars 2009 15:28
Localisation : Paris
Status : Hors ligne

Re: [..]Récuperer un nom d'hote grace à une @ip

#2

Message par GhostLine »

Et quid de faire une petite boucle qui teste la présence d'une IP sur le réseau avec la fonction ping avant de lancer la fonction _TCPIpToName() ?
Avatar du membre
Yle
Niveau 5
Niveau 5
Messages : 172
Enregistré le : mar. 21 avr. 2009 17:22
Localisation : La NORMANDIE -76
Status : Hors ligne

Re: [..]Récuperer un nom d'hote grace à une @ip

#3

Message par Yle »

Bonjour,

La question a déjà été posée et ceci doit résoudre ton souci

_GetHostName()
► Afficher le texte
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

Re: [..]Récuperer un nom d'hote grace à une @ip

#4

Message par tatane »

Non ça ne répond pas du tout à ce que je souhaite ou bien je ne comprends pas le script.

Je souhaite récupérer le nom netbios des pc d'un réseau local en scannant la plage d'adresses. Je me suis peut-être mal exprimé.

Voici un essai infructueux d'utilisation de "getnameinfo" :

Code : Tout sélectionner

;~ struct sockaddr_in {
;~         short   sin_family;
;~         u_short sin_port;
;~         struct  in_addr sin_addr;
;~         char    sin_zero[8];
;~ };

;~ int WSAAPI getnameinfo(
;~   _In_   const struct sockaddr FAR *sa,
;~   _In_   socklen_t salen,
;~   _Out_  char FAR *host,
;~   _In_   DWORD hostlen,
;~   _Out_  char FAR *serv,
;~   _In_   DWORD servlen,
;~   _In_   int flags
;~ );

Local $host, $service

TCPStartup()

Local $hDll_Ws2_32 = "ws2_32.dll"
$ret_inetaddr = DllCall($hDll_Ws2_32, "ulong", "inet_addr", "str", "192.168.220.2")

$ret_hton = DllCall($hDll_Ws2_32, "USHORT", "htons", "USHORT", 139)

$sockaddr = DllStructCreate("short sin_family ; USHORT port ; ptr in_adrr ; char sin_zero[8]")
DllStructSetData($sockaddr, "sin_family", 2) ; AF_INET
DllStructSetData($sockaddr, "port", $ret_hton[0])
DllStructSetData($sockaddr, "in_adrr", DllStructGetPtr($ret_inetaddr))

$ret = DllCall($hDll_Ws2_32, "int", "getnameinfo" _
        , "ptr", DllStructGetPtr($sockaddr) _
        , "int", DllStructGetSize($sockaddr) _
        , "str*", $host _
        , "dword", 1025 _
        , "str*", $service _
        , "dword", 0 _
        , "int", 0)

ConsoleWrite("error=" & @error & "   $ret[0]=" & $ret[0] & "   host=" & $host & @CR)

TCPShutdown()
Modifié en dernier par tatane le mar. 14 mai 2013 10:17, modifié 1 fois.
Avatar du membre
TT22
Membre émérite
Membre émérite
Messages : 1566
Enregistré le : lun. 18 avr. 2011 15:21
Localisation : La Quatrième Dimension
Status : Hors ligne

Re: [..]Récuperer un nom d'hote grace à une @ip

#5

Message par TT22 »

Le hasard fait bien les choses parce que je venais justement pour poster cette question :mrgreen:
Alors la solution m’intéresse aussi :wink:
Cordialement,
TT22
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

Re: [..] Récuperer un nom netbios grace à une @ip - getnamei

#6

Message par tatane »

J'ai modifié un petit peu mon script et j'obtiens une erreur 10047 de l'appel à la fonction getnameinfo.

Voici la signification de l'erreur qu'on peut trouver dans MSDN :

Address family not supported by protocol family.

An address incompatible with the requested protocol was used. All sockets are created with an associated address family (that is, AF_INET for Internet Protocols) and a generic protocol type (that is, SOCK_STREAM). This error is returned if an incorrect protocol is explicitly requested in the socket call, or if an address of the wrong family is used for a socket, for example, in sendto.


Il semblerait pourtant que mon appel à inet_addr soit bon... J'ai aussi posté sur le forum anglais et n'ai pour l'instant obtenu aucune réponse.
► Afficher le texte
tatane
Niveau 4
Niveau 4
Messages : 63
Enregistré le : mar. 30 juin 2009 20:47
Localisation : Angoulême
Status : Hors ligne

Re: [..] Récuperer un nom netbios grace à une @ip - getnamei

#7

Message par tatane »

J'ai fini par trouver la bonne syntaxe... Malheureusement il semblerait que la récupération du nom netbios du pc correspondant à l'@ip donnée soit aussi lente qu'avec "gethostbyaddr".

Voici le code fonctionnel :

Code : Tout sélectionner

TCPStartup()

Local $ip = "192.168.0.1"
Local $port = 139
Local $hDll_Ws2_32 = "ws2_32.dll"

$ret_inetaddr = DllCall($hDll_Ws2_32, "ulong", "inet_addr", "str", $ip) ; INADDR_NONE = 4294967295
$ret_hton = DllCall($hDll_Ws2_32, "USHORT", "htons", "USHORT", $port)

$sockaddr = DllStructCreate("short sin_family ; USHORT port ; ptr in_adrr ; char sin_zero[8]")
DllStructSetData($sockaddr, "sin_family", 2) ; AF_INET
DllStructSetData($sockaddr, "port", $ret_hton[0])
DllStructSetData($sockaddr, "in_adrr", $ret_inetaddr[0])

Local $dll_struct_host = DllStructCreate("char[1025]")
Local $dll_struct_service = DllStructCreate("char[32]")

$ret_getnameinfo = DllCall($hDll_Ws2_32, "int", "getnameinfo" _
        , "ptr", DllStructGetPtr($sockaddr) _
        , "int", DllStructGetSize($sockaddr) _
        , "ptr", DllStructGetPtr($dll_struct_host) _
        , "dword", DllStructGetSize($dll_struct_host) _
        , "ptr", DllStructGetPtr($dll_struct_service) _
        , "dword", DllStructGetSize($dll_struct_service) _
        , "int", 0x0004) ; NI_NOFQDN

ConsoleWrite("host=" & DllStructGetData($dll_struct_host,1) & "  service=" & DllStructGetData($dll_struct_service,1) & @CR)

TCPShutdown()
Apparemment tout ce qui est lié au port n'est pas obligatoire.
Répondre