同一台电脑可能出于不同的网络中,比如局域网,比如ADSL,如何才能获得当前有效的IP?

解决方案 »

  1.   

    gethostname,然后gethostbyname,hostent里面有个char FAR  FAR** h_addr_list,这个就是地址列表
      

  2.   

    内网,gethostname,然后gethostbyname,hostent里面有个char FAR  FAR** h_addr_list,这个就是地址列表
    外网
    IP助手函数。
      

  3.   

    我的意思就是要自己判断到底是在内网还是外网,比如你的网卡的地址可能是192.168.0.2,而通过ADSL上网,所以这个时候你是公网IP,而另一个时间你的电脑又处于内网,实际IP又是192.168.0.2,或者又可能你是DHCP内网上网,又是另外一个IP.gethostbyname只是得到一个列表比较难知道哪个是实际IP.
      

  4.   

    所以我问哪个是通往外网的IP?有效IP
      

  5.   

    按照你这个要求用gethostbyname就不是很方便了,干脆找个服务器连接一下,然后调用getsockname,获得的struct sockaddr里面就有你使用的地址了
      

  6.   

    "本地网卡的IP地址是绑定在网卡上的,而通过虚拟拨号上网时的IP是WAN连接".
    所以只要获得WAN连接的IP地址可能就是你说的"通往外网的IP"~~
    例如windows,他们在系统中处于不同的层,
    具体的我也忘了....HOHO,你可以看看windows网络结构
      

  7.   

    newbiestar()  如果是UDP调用GetSockName()好像不行啊,得到的IP是0.0.0.0,不知道什么原因
      

  8.   

    使用GetIpAddrTable得到ip地址列表
    #include "Iphlpapi.h"
    #pragma comment(lib,"Iphlpapi.lib")
    DWORD dwSize = 0;
    pIPAddrTable = new MIB_IPADDRTABLE; if(GetIpAddrTable(pIPAddrTable,&dwSize,0) == ERROR_INSUFFICIENT_BUFFER)
    {
    int x = sizeof(MIB_IPADDRTABLE);
    delete pIPAddrTable;
    pIPAddrTable = new MIB_IPADDRTABLE[dwSize / sizeof(MIB_IPADDRTABLE) + 1];
    }
    DWORD dwRetVal;
    if((dwRetVal = GetIpAddrTable(pIPAddrTable,&dwSize,0)) == NO_ERROR)
    {
    DWORD ip;
    for(int i = 0; i < pIPAddrTable->dwNumEntries; i++)
    {
    //inet_ntoa(*(in_addr*)&(pIPAddrTable->table[i].dwAddr));
    }
    }
      

  9.   

    如果你是ADSL拨号的
    可以用RAS函数得到该拨号的IP
      

  10.   

    to xing_xing_xing(ζ未名ζ)
    你用的#include "Iphlpapi.h"
    #pragma comment(lib,"Iphlpapi.lib")
    不是vc自带的吗?
      

  11.   

    to:  Hylas(羽心) 
    不仅仅是adsl,比如用户是笔记本,不同的时候处于不同的网络环境to: cyblueboy83(爱情白痴—电脑迷)
    Iphlpapi.lib 在sdk里面,vs6没有自带,vs.net自带了
      

  12.   

    to  cool_ice(冷冰)如果有拨号连接(如ADSL,PPOE,PPP),都可以得到该连接的IP另外的方法:
    你可以把你的网卡设置为192开头,那么地址列表中非192开头的IP可以认为外网IP