1.  获取外网IP的方法:

获取外网IP地址方法:
访问网站:http://www.3322.org/dyndns/getip
访问网站:http://city.ip138.com/ip2city.asp
访问网站:http://www.ip138.com/ips8.asp

使用URLDownloadToFile()需加载文件:
#include <urlmon.h>
#pragma comment (lib,"Urlmon.lib")

方法(1):通过URLDownloadToFile访问

//网址: http://www.3322.org/dyndns/getip
//说明: 用3322获取外网IP最为方便,直接读取网页源码,不用查找,网页源码就是外网IP
void GetNetAddress(CString &sIP)
{const char* szFile = "ip.txt";int ret = URLDownloadToFile(NULL, "http://www.3322.org/dyndns/getip", szFile, 0, NULL);if (S_OK == ret){FILE *f = NULL;fopen_s(&f, szFile, "rb");if (NULL != f){fseek(f, 0, SEEK_END);int nSize = ftell(f);fseek(f, 0, SEEK_SET);if (nSize > 0){char* pBuff = new char[nSize + 1];if (NULL != pBuff){memset(pBuff, 0, nSize + 1);fread(pBuff, nSize, 1, f);sIP = pBuff;sIP.TrimRight();delete []pBuff;pBuff = NULL;}}fclose(f);}}DeleteFile(szFile);
}

方法 (2):通过URLDownloadToFile访问

//网址: http://city.ip138.com/ip2city.asp
//说明: 返回网页内容"您的IP地址是:[118.244.143.145]",从中解析出IP地址
void GetNetAddress_V2(CString &sIP)
{sIP = "";const char* szFile = "ip.txt";URLDownloadToFile(0, "http://city.ip138.com/ip2city.asp", szFile, 0, NULL);FILE *f = NULL;fopen_s(&f, szFile, "rb");if (NULL != f){DeleteFile(szFile);return;}fseek(f, 0, SEEK_END);int nSize = ftell(f);fseek(f, 0, SEEK_SET);char* pBuff = new char[nSize + 1];if (NULL == pBuff){fclose(f);DeleteFile(szFile);return;}memset(pBuff, 0, nSize + 1);fread(pBuff, nSize, 1, f);char szTmp[MAX_PATH + 1] = { 0 };char* pPos1 = strstr(pBuff, "[");if (NULL != pPos1){char *pPos2 = strstr(pBuff, "]");if (NULL != pPos2){int nLen = pPos2 - pPos1 - 1;if (nLen > 0){memcpy_s(szTmp, nLen, pPos1 + 1, nLen);sIP = szTmp;}}}delete[]pBuff;pBuff = NULL;fclose(f);DeleteFile(szFile);
}

方法(3):通过CInternetSession访问

void GetNetAddress_V3(CString &sIP)
{//ip138网页sIP = "";CString Address = "http://city.ip138.com/ip2city.asp";//读取网络地址CInternetSession mySession(NULL, 0);CHttpFile* pHttpFile = (CHttpFile*)mySession.OpenURL(Address);if (NULL == pHttpFile){pHttpFile->Close();return;}//逐行读取下载的网页文本CString sLineStr = "";while (pHttpFile->ReadString(sLineStr)){ int nBegin = sLineStr.Find("[", 0);if (-1 != nBegin){int nEnd = sLineStr.Find("]");sIP = sLineStr.Mid(nBegin + 1, nEnd - nBegin - 1);}}pHttpFile->Close();mySession.Close();
}

2. API说明:

(1) URLDownloadToFile()

作用:指从指定URL地址(http://)读取内容并将读取到的内容保存到特定的文件里

原型:

#include <UrlMon.h>
#pragma comment(lib, "urlmon.lib") 
HRESULT URLDownloadToFile(                   //控件的接口,如果不是控件则为0
    LPUNKNOWN pCaller,                                 //要下载的url地址,不能为空
    LPCTSTR szURL,                                          //要下载的url地址,不能为空
    LPCTSTR szFileName,                                //下载后保存的文件名
    DWORD dwReserved,                                  //保留字段,必须为0
    LPBINDSTATUSCALLBACK lpfnCB           //下载进度状态回调
);

返回值:成功返回S_OK

例如:

URLDownloadToFile(NULL,"http://img.baidu.com/img/logo-zhidao.gif","c:\\a.gif",0,0);
URLDownloadToFile(0, _T("***ui.the9.**/wshell/WShell.exe"),    _T("D:\\WShell.exe"), 0, NULL);

(2)DeleteUrlCacheEntry()

原型:

#include <wininet.h>
#pragma comment(lib, "wininet.lib")
BOOL DeleteUrlCacheEntry (LPCTSTR lpszUrlName);

功能:删除缓存中指定的源文件名,如果指定文件存在 则删除
参数:lpszUrlName 源文件的名字 该名字不能包含换码符

返回值:如果成功返回真 否则返回假

3.  删除URLDownloadToFile缓存的办法:

问题:当循环“连接-断开-连接-断开...”多个不同VPN时,程序中用URLDownloadToFile()下载http://www.3322.org/dyndns/getip并解析外网IP地址,发现每次下载下来的文件中所包含的外网地址都一样,都是第一次VPN连接时的外网地址。然而通过手动打开网页http://www.3322.org/dyndns/getip所看到的外网IP却是不相同的,实际上,不相同是对的,而相同是由于URLDownloadToFile()下载后没删除缓存导致的。

下面两种删除缓存的办法:

方法 1:
我们可以对URL进行改动,让它每次访问不同的URL但指向相同的页面,
例如在URL结尾添加一些无意义的参数:"http://www.dtapp.cn?abc=1"
这里的 ?abc=1 可以随机实现,下次下载则改成 ?abc=2 因为URL不同,所以不会在缓存中找到。
最后程序改成:

int nRand = time(NULL); // 用时间作为随机数CString szUrl;
szUrl.Format("http://www.3322.org/dyndns/getip?abc=%d", nRand); //生成随机URLCString szFileName = "C:\\ip.txt";if (S_OK == URLDownloadToFile(NULL, szUrl, szFileName, NULL,NULL))
{// 下载成功
}
else
{// 下载失败
}

方法 2:使用DeleteUrlCacheEntry清理缓存后再使用URLDownloadToFile下载文件

CString szUrl = "http://www.3322.org/dyndns/getip";//先清理缓存
DeleteUrlCacheEntry (szUrl); CString szFileName = "C:\\ip.txt";//再下载
if (S_OK == URLDownloadToFile(NULL, szUrl, szFileName, NULL,NULL))
{//下载成功
}
else
{//下载失败
}

如何获取外网IP地址相关推荐

  1. python获取公网ip的几种方式_python获取外网ip地址的方法总结

    本文实例总结了python获取外网ip地址的方法.分享给大家供大家参考.具体如下: 一.利用脚本引擎库直接获取 import console; import web.script import ine ...

  2. 如何从HttpServletRequest中获取外网IP地址

    如何从HttpServletRequest中获取外网IP地址 Java 中可以通过HttpServletRequest类的getRemoteAddr(); //可能是用户真是ip也可能是代理服务器的i ...

  3. 获取外网IP地址API

    1.获取外网IP地址 地址: http://pv.sohu.com/cityjson?ie=utf-8 返回结果: var returnCitySN = {"cip": " ...

  4. Python定时获取外网IP地址并发送邮件

    去年入手了树莓派4B,放在家里当服务器用.由于电信公网IP经常更换,所以需要定期获取公网IP才能连上. import os import threading from smtplib import S ...

  5. MFC 获取外网IP地址和MAC地址

    MAC地址获取: CString GetMacAddress(void) { //CString strIP,strGateWay,strSubnetMask; CString strMac; str ...

  6. MFC C++ 获取外网IP地址

    #include <afxinet.h>//GB2312 转换成 Unicode wchar_t* GB2312ToUnicode(const char* szGBString) {UIN ...

  7. [网络]_获取内外网IP地址【Auto.js】

    auto(); console.show();importClass('java.net.Inet4Address'); importClass('java.net.InetAddress'); im ...

  8. 怎样查询本机ip地址?如何利用花生壳获取外网IP教程

    听到ip地址这个概念,想必大家都不会陌生,如果我们想要跟对方进行通信,通常我们需要知道对方的ip地址,另外在网络通信中,还有一个非常重要的地址,那就是mac地址.那么我们如何知道本机ip地址呢?我们如 ...

  9. Golang 获取当前外网IP/地址/运营商

    Golang 获取当前外网IP/地址/运营商 - Go语言中文网 - Golang中文社区 package mainimport ("fmt""io/ioutil&quo ...

最新文章

  1. 【Qt】QtCreator中使用ActionManager类管理标题栏(MunuBar)、菜单(Menu)和菜单中的项目(Action)
  2. 你在付费听《说好不哭》,我在这里免费看直播还送书 | CSDN新书发布会
  3. QT学习:多国语言国际化
  4. exit和return区别
  5. WebForm-博客园-1.0-账户模块(Passport)-登录与注册
  6. linux 同步北京时间_linux 同步北京时间
  7. 笑谈“委托”与“事件”
  8. java 常量 类型_Java的常量及数据类型
  9. MapReduce Shuffle详解
  10. 软件详细设计文档(终)
  11. 免费下载 | ContextCapture分块OBJ模型合并与裁剪
  12. 声学模型训练-LDA算法
  13. 【IoT毕业设计】树莓派开发板+机智云IoT+监测机器人
  14. 李宏毅2023春季机器学习笔记 - 01生成AI(ChatGPT)
  15. Python与数据分析
  16. 九个Web开发者必备的软技能
  17. Vue3和码上掘金实现猜数字小游戏
  18. 240Hz超高刷新率加持,HKC疾风SG27C PLUS电竞显示器的使用新体验
  19. 威尔逊定理证明(上)
  20. mysql-获取当前系统时间

热门文章

  1. Linux系统上运行 .net core程序
  2. 江西银行与金融壹账通强强联合,加速智能化升级发展
  3. nfs-ganesha导出cephfs为nfs
  4. 假期无聊冰河开发了一款国民级游戏!
  5. Class3 打造在线编程环境学习笔记
  6. JVM GC日志解析
  7. 基础打好了,上层建筑就容易获得了
  8. 《游戏设计艺术(第二版)》第七章个人学习
  9. backbone 模板 html,用Backbone.js绑住服务端生成的html
  10. 数学建模之线性规划学习笔记