+ -
当前位置:首页 → 问答吧 → win32的API有没办法获取本机的外网IP地址??

win32的API有没办法获取本机的外网IP地址??

时间:2011-12-13

来源:互联网

注意,我说的是外网IP地址,而不是局域网IP

作者: weiwuyuan   发布时间: 2011-12-13

如果是系统直接ADSL拔号,可以参考下面的代码
C/C++ code

#include"iphlpapi.h"
#pragma comment(lib,"Iphlpapi.lib")

    PIP_ADAPTER_INFO pAdapterInfo;
    DWORD AdapterInfoSize;
    TCHAR szMac[32]   =   {0};  
    DWORD Err;    
    AdapterInfoSize   =   0;  
    Err   =   GetAdaptersInfo(NULL,   &AdapterInfoSize);  
    if((Err   !=   0)   &&   (Err   !=   ERROR_BUFFER_OVERFLOW)){  
        return   FALSE;  
    }
    //   分配网卡信息内存  
    pAdapterInfo   =   (PIP_ADAPTER_INFO)   GlobalAlloc(GPTR,   AdapterInfoSize);  
    if(pAdapterInfo   ==   NULL){  
        return   FALSE;  
    }
    if(GetAdaptersInfo(pAdapterInfo,   &AdapterInfoSize)   !=   0){  
        GlobalFree(pAdapterInfo);  
        return   FALSE;  
    }
    PIP_ADAPTER_INFO pAdapter = NULL;
    pAdapter=pAdapterInfo;
    
    while(pAdapter)
    {
         //pAdapter->IpAddressList.IpAddress.String 这里面是各个连接的IP地址,
      //本地连接的宽带拔号的IP地址都在,自己分析一下
            //连接类型参考pAdapter->Type的值(PCI网卡,无线网卡,PPPOE,VPN)具体怎么分不清楚
        pAdapter = pAdapter->Next;
    }
    
    GlobalFree(pAdapterInfo);



如果机器使用的是路由器,那好像就没办法用API来直接获取
只能使用Internet的API来利用网页(例如:www.ip138.com),分析源代码取得外网IP了

作者: SilenceNet   发布时间: 2011-12-13

引用 1 楼 silencenet 的回复:
如果是系统直接ADSL拔号,可以参考下面的代码

C/C++ code


#include"iphlpapi.h"
#pragma comment(lib,"Iphlpapi.lib")

PIP_ADAPTER_INFO pAdapterInfo;
DWORD AdapterInfoSize;
TCHAR szMac[32] = {0}; ……


获取网卡信息(包括MAC,IP地址)的代码我有,这个我回去找一下。
那你的意思说,如果我的电脑有外网IP,那么可以直接通过查询网卡信息,来得到外网IP?
而如果没有外网IP,(比如共享别人的网络)就得不到是么?

作者: weiwuyuan   发布时间: 2011-12-13

引用 2 楼 weiwuyuan 的回复:
获取网卡信息(包括MAC,IP地址)的代码我有,这个我回去找一下。
那你的意思说,如果我的电脑有外网IP,那么可以直接通过查询网卡信息,来得到外网IP?
而如果没有外网IP,(比如共享别人的网络)就得不到是么?

是这个意思,如果宽带连接上了,GetAdaptersInfo是有返回宽带连接的IP地址等信息的

作者: SilenceNet   发布时间: 2011-12-13