如何获取本机的 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