标题:如何获取本机的 IP 地址,请指教?
只看楼主
JHKCHEN
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2011-5-31
结帖率:10%
已结贴  问题点数:10 回复次数:10 
如何获取本机的 IP 地址,请指教?
如何获取本机的IP地址,请指教?
搜索更多相关主题的帖子: 如何 IP地址 
2014-09-23 11:09
外部三电铃
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:那一年
等 级:贵宾
威 望:55
帖 子:2004
专家分:7306
注 册:2007-12-17
得分:2 
5年前我也被这个问题困扰。当时想着用DOS命令获得本机IP地址,但这样获得的只有内网地址, 192.168.x.x 这种,为什么获得不到呢,现在明白了。因为IP地址不属于操作系统管,属于电信运营商管,所以电脑自己是无法知道自己的IP地址的。必须访问外网才能知道自己的IP,比如在百度搜IP这个关键词 http://www.baidu.com/s?wd=IP ,用程序向这个网站发送请求,然后根据返回的网页代码,从里面提取出来IP地址

那一年,苍井空还是处女
2014-09-23 11:17
JHKCHEN
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2011-5-31
得分:0 
你好,我想要的就是内网地址, 192.168.x.x 这种,是单位的内网。
2014-09-23 11:26
外部三电铃
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:那一年
等 级:贵宾
威 望:55
帖 子:2004
专家分:7306
注 册:2007-12-17
得分:0 
windows下用ipconfig
linux下用ifconfig

那一年,苍井空还是处女
2014-09-23 11:29
JHKCHEN
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2011-5-31
得分:0 
windows下用ipconfig

能否详细的,谢了
2014-09-23 11:31
sdta
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:江苏省连云港市
等 级:版主
威 望:323
帖 子:9621
专家分:26174
注 册:2012-2-5
得分:2 
http://hi.baidu.com/myvfp/item/74de01c9e49e840ac710b251

坚守VFP最后的阵地
2014-09-23 11:46
tlliqi
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:204
帖 子:15453
专家分:65956
注 册:2006-4-27
得分:2 
xp : “开始”→运行→输入“cmd”→确定 然后输入“ipconfig”,显示出来的“IP Address”就是你的本机IP地址。
win98:“开始”→运行→输入“winipcfg”就可以看到本地IP
2014-09-23 11:51
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:2 
有时会遇到多网络适配器的情况,会有多个IP地址。
编程获取本地IP,也可以用WMI,也可以用Windows API。
一个WMI应用示例,代码相对简单:
程序代码:
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


用Windows API可用getaddrinfo()或gethostbyname()。
一个示例,代码相对复杂:
程序代码:
*
* 获取主机所有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


[ 本帖最后由 吹水佬 于 2014-9-24 08:14 编辑 ]
2014-09-24 08:11
qingfameng
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:35
帖 子:964
专家分:3019
注 册:2010-2-6
得分:2 
与8楼的第1个类似的一段(多提供点参考资料吧)
*LcIP=''
Local oWMI As Object,oLocal As Object,oHARDWARE As Object,object1 As Object,;
lcCPUID,LcMAC,lcHDID,lcSerial
 oWMI=Createobject("WbemScripting.SWbemLocator")
 oLocal=oWMI.ConnectServer(".", "root\cimv2")
 oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=1")
 For Each object1 In oHARDWARE
 LcIP=object1.Properties_('IPAddress').Value
 Exit
 Endfor
 ?'IP地址:',LcIP
*******************
2014-09-25 22:41
吹水佬
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:432
帖 子:10064
专家分:41463
注 册:2014-5-20
得分:0 
以下是引用qingfameng在2014-9-25 22:41:48的发言:

与8楼的第1个类似的一段(多提供点参考资料吧)
*LcIP=''
Local oWMI As Object,oLocal As Object,oHARDWARE As Object,object1 As Object,;
lcCPUID,LcMAC,lcHDID,lcSerial
 oWMI=Createobject("WbemScripting.SWbemLocator")
 oLocal=oWMI.ConnectServer(".", "root\cimv2")
 oHARDWARE=oLocal.ExecQuery("SELECT * FROM Win32_NetworkAdapterConfiguration Where IPEnabled=1")
 For Each object1 In oHARDWARE
 LcIP=object1.Properties_('IPAddress').Value
 Exit
 Endfor
 ?'IP地址:',LcIP
*******************


这种连接方式,可用在远程操作,但会受到授权或网络安全限制。
oWMI=Createobject("WbemScripting.SWbemLocator")
oLocal=oWMI.ConnectServer("IP或服务名", "root\cimv2", "用户名", "密码")
2014-09-26 07:22



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-436472-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.091826 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved