Page 1 sur 1

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

Posté : lun. 13 mai 2013 14:15
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.

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

Posté : lun. 13 mai 2013 14:18
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() ?

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

Posté : lun. 13 mai 2013 17:06
par Yle
Bonjour,

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

_GetHostName()
► Afficher le texte

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

Posté : lun. 13 mai 2013 17:47
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()

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

Posté : lun. 13 mai 2013 18:03
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:

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

Posté : mer. 15 mai 2013 09:12
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

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

Posté : mer. 15 mai 2013 13:44
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.