如何获取外网IP地址


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); //生成随机URL

CString 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
{
	//下载失败
}





  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值