如何获取本机的 IP 地址,请指教?
如何获取本机的IP地址,请指教?
CLEAR oService = Getobject("winmgmts:") oClasses = oService.ExecQuery("select * from Win32_NetworkAdapterConfiguration where IPEnabled = 1") FOR EACH oClass IN oClasses ? ? "网络适配器....." + NVL(oClass.Description, "<NULL>") ? "硬件地址(MAC).." + NVL(oClass.MACAddress, "<NULL>") ? "IP地址........." + NVL(oClass.IPAddress[0], "<NULL>") ENDFOR
* * 获取主机所有IP * SET TALK OFF CLEAR #DEFINE MAX_STRLEN 254 * WSADATA STRUCT * wVersion WORD ? * wHighVersion WORD ? * szDescription BYTE WSADESCRIPTION_LEN + 1 dup (?) * szSystemStatus BYTE WSASYS_STATUS_LEN + 1 dup (?) * iMaxSockets WORD ? * iMaxUdpDg WORD ? * lpVendorInfo DWORD ? * WSADATA ENDS #DEFINE WSADATA REPLICATE(0h00, 398) DECLARE LONG WSAStartup IN "Ws2_32" LONG, STRING@ DECLARE LONG gethostname IN "Ws2_32" STRING@, LONG DECLARE LONG gethostbyname IN "Ws2_32" STRING@ DECLARE LONG inet_ntoa IN "Ws2_32" LONG DECLARE LONG WSACleanup IN "Ws2_32" DECLARE LONG getaddrinfo IN "Ws2_32" STRING@, STRING@, STRING@, LONG@ DIMENSION aIP(1) ? "使用gethostbyname函数" _DisPlayIP(域名转IP(@aIP), @aIP) _DisPlayIP(域名转IP(@aIP, "www.baidu.com"), @aIP) _DisPlayIP(域名转IP(@aIP, "baidu.com"), @aIP) ? ? "使用getaddrinfo函数" _DisPlayIP(_GetAddr(@aIP), @aIP) _DisPlayIP(_GetAddr(@aIP, "www.), @aIP) _DisPlayIP(_GetAddr(@aIP, "), @aIP) CLEAR DLLS RETURN * 显示输出 FUNCTION _DisPlayIP(nLen, aIP) ? FOR i = 1 TO nLen ? aIP[i] ENDFOR ENDFUNC * * 使用gethostbyname函数将域名转换为IP地址 * 该函数返回指向位于winsock内部缓冲区中的一个hostent结构指针。 * 结构体如下: * * hostent STRUCT * h_name dword ? * 指针,指向和IP地址对应的主机名 * h_alias dword ? * 指针,指向一个包含别名指针的列表 * h_addr word ? * 返回的IP地址类型 * h_len word ? * 每个地址的长度 * h_list dword ? * 指向一个指针列表,列表中保存指向各个IP地址的指针 * hostent ENDS * * 可以表示为: (hostent结构) (IP地址指针列表) (IP地址) * gethostbyname的返回值----> h_name | | * h_alias | | * h_addr | | * h_len | | * h_list -----> IP地址1的指针 -----> IP地址1 * IP地址2的指针 -----> IP地址2 * IP地址3的指针 -----> IP地址3 * ..... -----> IP地址n * * 域名转IP(aIP, sz域名) * 将主机名和IP存放在aIP数组并返回aIP数组元素数目 * 参数:aIP,存放主机名IP的数组。sz域名,主机名,如为空取本机名。 * FUNCTION 域名转IP(aIP, sz域名) LOCAL stWsaData, lpIP列表地址, lpIP地址, nIP, szIP, nlen stWsaData = WSADATA TRY WSAStartup(0x0202, @stWsaData) IF EMPTY(sz域名) * 取本机名 sz域名 = SPACE(MAX_STRLEN) gethostname(@sz域名, LEN(sz域名)) sz域名 = LEFT(sz域名, AT(0h00, sz域名) - 1) ENDIF DIMENSION aIP(1) aIP[1] = sz域名 * IP列表地址指针 * gethostbyname()返回 HOSTENT 结构指针,偏移12是IP列表地址指针 lpIP列表地址 = CTOBIN(SYS(2600, gethostbyname(@sz域名) + 12, 4), "4RS") * 第一个IP地址指针 lpIP地址 = CTOBIN(SYS(2600, lpIP列表地址, 4), "4RS") DO WHILE (lpIP地址 > 0) * 取IP地址 * SYS(2600, lpIP地址, 4)返回 in_addr 结构指针 nIP = CTOBIN(SYS(2600, lpIP地址, 4), "4RS") * 转换成“.”分隔字串(xxx.xxx.xxx.xxx) * inet_ntoa()返回IP字符串指针 szIP = SYS(2600, inet_ntoa(nIP), 16) szIP = LEFT(szIP, AT(0h00, szIP)-1) nlen = ALEN(aIP) + 1 DIMENSION aIP(nlen) aIP[nlen] = szIP * 下一个IP地址指针 lpIP列表地址 = lpIP列表地址 + 4 && 32位(DWORD) lpIP地址 = CTOBIN(SYS(2600, lpIP列表地址, 4), "4RS") ENDDO WSACleanUp() CATCH MESSAGEBOX("调用“域名转IP()”函数异常,可能是使用了无效的域名。") ENDTRY RETURN ALEN(aIP) ENDFUNC * * 使用getaddrinfo函数将域名转换为IP地址 * 该函数参数lpResult返回指向addrinfo结构指针 * * typedef struct addrinfo { * int ai_flags DWORD * int ai_family DWORD * int ai_socktype DWORD * int ai_protocol DWORD * size_t ai_addrlen DWORD * char *ai_canonname DWORD * struct sockaddr *ai_addr DWORD * struct addrinfo *ai_next DWORD 下一个addrinfo结构指针 * } ADDRINFOA, *PADDRINFOA * * sockaddr结构与sockaddr_in结构相同 * * sockaddr_in STRUCT * sin_family WORD ? * sin_port WORD ? * sin_addr in_addr <> IP地址 * sin_zero BYTE 8 dup (?) * sockaddr_in ENDS * FUNCTION _GetAddr(aIP, szNodeName) LOCAL stWsaData, lpResult, lpSockAddr, nIP, szIP, nlen stWsaData = WSADATA TRY WSAStartup(0x0202, @stWsaData) IF EMPTY(szNodeName) szNodeName = "" ENDIF lpResult = 0 getaddrinfo(@szNodeName, NULL, NULL, @lpResult) DIMENSION aIP(1) IF EMPTY(szNodeName) szNodeName = "本机" ENDIF aIP[1] = szNodeName DO WHILE lpResult > 0 lpSockAddr = CTOBIN(SYS(2600, lpResult+24, 4), "4RS") nIP = CTOBIN(SYS(2600, lpSockAddr+4, 4), "4RS") IF nIP > 0 szIP = SYS(2600, inet_ntoa(nIP), 16) szIP = LEFT(szIP, AT(0h0, szIP)-1) nlen = ALEN(aIP) + 1 DIMENSION aIP(nlen) aIP[nlen] = szIP ENDIF lpResult = CTOBIN(SYS(2600, lpResult+28, 4), "4RS") ENDDO WSACleanUp() CATCH MESSAGEBOX("调用“_GetAddr()”函数异常,可能是使用了无效的域名。") ENDTRY RETURN ALEN(aIP) ENDFUNC