1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > 如何获取外网IP地址

如何获取外网IP地址

时间:2022-03-28 23:20:16

相关推荐

如何获取外网IP地址

1. 获取外网IP的方法:

获取外网IP地址方法:

访问网站:/dyndns/getip

访问网站:/ip2city.asp

访问网站:/ips8.asp

使用URLDownloadToFile()需加载文件:

#include <urlmon.h>

#pragma comment (lib,"Urlmon.lib")

方法(1):通过URLDownloadToFile访问

//网址: /dyndns/getip//说明: 用3322获取外网IP最为方便,直接读取网页源码,不用查找,网页源码就是外网IPvoid GetNetAddress(CString &sIP){const char* szFile = "ip.txt";int ret = URLDownloadToFile(NULL, "/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访问

//网址: /ip2city.asp//说明: 返回网页内容"您的IP地址是:[118.244.143.145]",从中解析出IP地址void GetNetAddress_V2(CString &sIP){sIP = "";const char* szFile = "ip.txt";URLDownloadToFile(0, "/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 = "/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,"/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()下载/dyndns/getip并解析外网IP地址,发现每次下载下来的文件中所包含的外网地址都一样,都是第一次VPN连接时的外网地址。然而通过手动打开网页/dyndns/getip所看到的外网IP却是不相同的,实际上,不相同是对的,而相同是由于URLDownloadToFile()下载后没删除缓存导致的。

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

方法 1:

我们可以对URL进行改动,让它每次访问不同的URL但指向相同的页面,

例如在URL结尾添加一些无意义的参数:"?abc=1"

这里的 ?abc=1 可以随机实现,下次下载则改成 ?abc=2 因为URL不同,所以不会在缓存中找到。

最后程序改成:

int nRand = time(NULL); // 用时间作为随机数CString szUrl;szUrl.Format("/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 = "/dyndns/getip";//先清理缓存DeleteUrlCacheEntry (szUrl); CString szFileName = "C:\\ip.txt";//再下载if (S_OK == URLDownloadToFile(NULL, szUrl, szFileName, NULL,NULL)){//下载成功}else{//下载失败}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。