网上找了好久,基本上说用gethostbyname函数,可惜试了不行,只能查到内网IP.还有就是说用查IP网站的方式来获取,感觉那样的话某天那个网站over了自己的程序也一起over了,请问大家有没有不通过IP查询网站直接使用windows的API来获取主机外网IP的方法?

解决方案 »

  1.   

    上www.ip138.com,把你公网那段字符串抠出来源代码很简单<html>
    <head>
    <meta http-equiv="content-type" content="text/html; charset=gb2312">
    <title> 您的IP地址 </title>
    </head>
    <body style="margin:0px"><center>您的IP地址是:[XXX.100.XXX.XXX] </center></body></html>
      

  2.   

    局域网里哪来的公网IP啊,那个是动态分配的,要借助3楼说的这种网站来自已从文件中解析你自己的ip地址。当然前题是你一定得连着外网才可以。
      

  3.   

    就是动态分配的那个IP,通过网站的那个我知道,我是想问有没有不通过IP查询网站直接使用windows的API来获取主机外网IP的方法?
      

  4.   

    哈哈,我就是这样做的,用JSP到138取的数据。
      

  5.   

    你要查询自己的公网IP就必须跟公网服务器通讯,你不上网怎么能知道自己的IP呢。
    也就是必须有以下过程
    1.连上公网
    2.像公网服务器发送数据
    3.公网服务器必须要给你返回你的IP地址只有以上3步同时都成立才行。
    至于你用什么方法就看你自己了,方法多的是。
      

  6.   

    /*
    *取得本机外网IP*
    *返回值为IP字串
    */
    CString General::GetIp()
    {
    CString ipStr="";
    char szTempFile [MAX_PATH];
    char szTempPath [MAX_PATH];
    GetTempPath(MAX_PATH, szTempPath); 
    UINT nResult=GetTempFileName (szTempPath, _T ("ip"),0,szTempFile);
    int ret=URLDownloadToFile(NULL,"http://www.ip138.com/ip2city.asp",szTempFile,0,NULL);
    if (ret==S_OK) //如果下载成功
    {
    FILE *f;
    f=fopen(szTempFile,"rb");
    if(f)
    {
    fseek(f,0,SEEK_END);//得到文件大小
    int ilength=ftell(f);
    fseek(f,0,SEEK_SET);
    if(ilength>0)
    {   
    char szMyIp[16] = {0};
    char fBuffer[256] = {0};
    fread(fBuffer, 256, 1, f);
    int iBegin,iEnd;

    for (int i = 0; i < ilength; i++)
    {
    //取得"["的位置
    if (fBuffer[i] == 0x5b)
    iBegin = i;
    //取得"]"的位置
    if (fBuffer[i] == 0x5d)
    {
    iEnd = i;
    break;
    }
    }
    memcpy(szMyIp, fBuffer + iBegin + 1, iEnd - iBegin - 1);
    //AfxMessageBox(szMyIp);
    ipStr=szMyIp;
    }
    }
    }
      

  7.   

    ls的还是通过查询网站的方法啊,那种方法我早就实现了....
    现在我想知道的是有没有其它办法获取自己的外网ip地址,比如到到路由/网关上直接获取什么的?
      

  8.   

    用gethostname很简单啊!! char szHostName[128];  
      struct hostent * pHost;    
        int i; 
    LPCSTR IPAddress;
       if(gethostname(szHostName,128)==0)    
    {
             
         pHost = gethostbyname(szHostName); 
     for( i = 0; pHost!= NULL && pHost->h_addr_list[i]!= NULL; i++ )     
         {
                  IPAddress=inet_ntoa (*(struct in_addr *)pHost->h_addr_list[i]);
               
         }
    }IPAddress就是公网ip了
      

  9.   

    tracert这个doc 命令可以看到
      

  10.   

    我的机子在局域网内,gethostname只能获得内网的IP.
      

  11.   

    首先公网IP是你连上公网后才有的,而且这个IP一般是你的路由启动一次该一次的。所以LZ如果说的只是那个查IP的网站倒了的话,你要保证你还连着公网。这样你就可以通过你的路由器获得你的公网IP。但这个IP通常是连在这个路由器上的所以机器公用的。以为局域网内一般采用的是端口多路复用的NAT.你可以拿着路由说明书登陆路由设置界面。查看运行状态,此时WAN列表中的IP就是路由IP,也就是你用的公网IP。
      

  12.   

    可能我表述的不够清楚吧:我的机子是通过路由器连到公网的,没联公网的话谈公网IP屁用都没有.我现在想知道的是,有没有不通过查IP网站源文件的方法来获得本机的公网IP,就像以前珊瑚虫QQ上面能显示自己的公网IP那样?
      

  13.   

    直接登录
    http://www.ip138.com/
    就看到了。
      

  14.   

    一般来说 链接ip138.com   或者  链接路由器(这个通用性更差)都可以查询   直接插上网线就像知道IP   没办法  除非是自己拨号的