### VC 获取公网 IP 地址方法解析 #### 一、背景与目的 在软件开发过程中,有时我们需要获取当前计算机所在的公网 IP 地址。这在许多应用场景中都非常有用,例如远程服务配置、网络调试等。本文将详细介绍一个使用 VC++(Visual C++)实现的公网 IP 址获取方法,并对其中的关键技术点进行深入分析。 #### 二、关键技术点 ##### 2.1 CInternetSession 类与 CHttpFile 类 这两个类是 Microsoft 提供的用于网络编程的 MFC(Microsoft Foundation Classes)类库中的重要组成部分。`CInternetSession` 类用于管理 Internet 会话,而 `CHttpFile` 类则代表了一个 HTTP 文件对象,可以用来发送和接收 HTTP 请求及响应。 - **CInternetSession**:用于创建与 Internet 的连接,提供了一系列的网络功能接口,比如发送邮件、下载文件等。 - **CHttpFile**:继承自 `CFile` 类,提供了特定于 HTTP 的功能,如发送 GET 或 POST 请求。 ##### 2.2 获取公网 IP 地址 本方法的核心在于通过访问一个能够返回用户公网 IP 地址的网站来间接获取当前的 IP 地址。在这个例子中,使用的网站是 `http://www.zu14.cn/ip/`,它会返回访问者的公网 IP 地址。 ```cpp CString m_szSite = "http://www.zu14.cn/ip/"; try { pFile = (CHttpFile*)session.OpenURL(m_szSite); } catch (CInternetException *pEx) { pFile = NULL; pEx->Delete(); } ``` 这段代码首先尝试通过 `CInternetSession` 对象建立到指定 URL 的连接。如果成功,就会返回一个 `CHttpFile` 指针对象 `pFile`,用于后续的数据交互。 ##### 2.3 读取响应数据 一旦成功建立了连接并发送了请求,就可以通过 `CHttpFile` 对象读取服务器返回的数据。 ```cpp if (pFile) { while (pFile->ReadString(str)) { ch += str + "\r\n"; } pFile->Close(); delete pFile; } else { ch += ""; } ``` 这里使用了一个循环,不断调用 `ReadString` 方法来读取数据,直到没有更多数据可读为止。读取到的数据被拼接到 `ch` 字符串中。最后关闭文件并释放资源。 ##### 2.4 数据处理 获取到的数据可能包含 HTML 标签或其他非 IP 地址的信息,因此需要进一步处理才能得到纯净的 IP 地址。 ```cpp CString jian(CString ch) { CString aaa; for (int i = 0; i < ch.GetLength(); i++) { if (ch.Mid(i, 1) == '0' || ch.Mid(i, 1) == '1' || ch.Mid(i, 1) == '2' || ch.Mid(i, 1) == '3' || ch.Mid(i, 1) == '4' || ch.Mid(i, 1) == '5' || ch.Mid(i, 1) == '6' || ch.Mid(i, 1) == '7' || ch.Mid(i, 1) == '8' || ch.Mid(i, 1) == '9' || ch.Mid(i, 1) == '.') { aaa += ch.Mid(i, 1); } else { break; } } return (aaa); } ``` 这个函数通过遍历字符串中的每个字符,只保留数字和点号,从而确保最终返回的是有效的 IP 地址。 #### 三、总结 本文介绍了一种基于 VC++ 的公网 IP 地址获取方法。通过对关键代码段的解析,我们了解到如何利用 MFC 库中的 `CInternetSession` 和 `CHttpFile` 类来实现网络通信,并通过简单的数据处理技巧得到纯净的公网 IP 地址。这种方法简单实用,在实际项目开发中具有较高的应用价值。
#include "afxinet.h"
//获取公网IP地址
CString getLocalIpAddress()
{
CInternetSession session; //声明该对象为获取网页属性做准备
CHttpFile *pFile=NULL;
CString str,ch;
CString m_szSite="http://www.zu14.cn/ip/"; //该地址是获取外网IP的关键,原理就是通过该地址来获取外网IP的
try{
pFile=(CHttpFile*)session.OpenURL(m_szSite);} //打开该地址
catch(CInternetException *pEx) //错误处理
{
pFile=NULL;
pEx->Delete();
}
if(pFile)
{
while(pFile->ReadString(str)) //读入该字符串
{
ch+=str+"\r\n";
}
pFile->Close();
delete pFile;
}
else
{
ch+="";
- jxw_00172013-11-16没有测试通过
- hili2102013-06-30貌似是通过网站获取的方式,最近下到了一个非网页获取方式,挺不错的,打算用来作为服务器变更IP的通知软件
- beizhongshui_71002013-08-10通过ip138获取到了,试试这种办法。能不能vc直接读ip管理服务器或解析IP段。而不依赖于具体的网站。
- 粉丝: 54
- 资源: 11
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助