本编辑框用于向用户显示输出结果。
2、增加另一个编辑框,ID标识符为IDC_EDIT2,选中Mutiline和Want return属性。这个编辑框用于接受用户输入网址。
3、在对话框上布置5个按钮,分别用来实现HTTP、FTP、GOPHER、FINGER和WHOIS查询。ID标识符分别为IDC_BUTTON_HTTP、IDC_BUTTON_FTP、IDC_BUTTON_GOPHER、IDC_BUTTON_FINGER、IDC_BUTTON_WHOIS。
下面,我们开始给控件附加变量和代码,以完成程序功能。首先,我们来看如何使用HTTP协议进行查询。
在编写实际进行查询的代码前,应给两个编辑框附加变量,以实现输入和输出的目的。我们使用classwizard,给编辑框IDC_EDIT1附加变量m_out,给编辑框IDC_EDIT2附加变量m_host。它们都应为Cstring类型的变量。
下面,我们给对话框类CQueryDlg添加一个函数,它用于实现HTTP查询。函数原形为:
void TryURL(Cstring URL);
其实现代码为:
void CQueryDlg::TryURL(Cstring URL)
{
CInternetSession session;
m_out+="正在链接"+URL+"\r\n";
UpdateData(FALSE);
CInternetFile* file=NULL;
try
{
file=(CInternetFile*)session.OpenURL(URL);
}
catch(CInternetException* pEx)
{
file=NULL;
pEx->Delete();
}
if(file)
{
m_out+="已建立链接。\r\n";
Cstring line;
for(int I=0;I<20&&file->ReadString(line);I++)
{
m_out+=line+"\r\n";
}
file->Close();
delete file;
}
else
{
m_out+="本地址没有发现http主机\r\n";
}
m_out+="------------------------------------------------------\r\n";
UpdateData(FALSE);
}
这个函数是如何实现HTTP链接的呢,我们分析如下:
首先,建立一个internet会话,这要定义一个CInternetSession的对象。其构造函数的原形如下:
CInternetSession( LPCTSTR pstrAgent = NULL, DWORD dwContext = 1, DWORD dwAccessType = INTERNET_OPEN_TYPE_PRECONFIG, LPCTSTR pstrProxyName = NULL, LPCTSTR pstrProxyBypass = NULL, DWORD dwFlags = 0 );
这个函数需要定义很多参数,但是,本程序都使用缺省值,即“=”号后的值。CInternetSession构造函数参数说明如下:
LPCTSTR pstrAgent-应用程序名,如果为NULL,它将替你填入你在AppWizard中给定的程序名。
DWORD dwContext-本操作的设备关联符定义。
DWORD dwAccessType-访问类型,为以下参数之一,INTERNET_OPEN_TYPE_PRECONFIG (default), INTERNET_OPEN_TYPE_DIRECT, 或 INTERNET_OPEN_TYPE_PROXY
LPCTSTR pstrProxyName-如访问类型为INTERNET_OPEN_TYPE_PROXY,则给该参数赋予协议名称。
LPCTSTR pstrProxyBypass-如访问类型为INTERNET_OPEN_TYPE_PROXY,则该参数为不通过协议服务器而直接链接的一系列地址。
DWORD dwFlags-可为以下参数,INTERNET_FLAG_DON''T_CACHE, INTERNET_FLAG_ASYNC, 和INTERNET_FLAG_OFFLINE.
dwAccessType值缺省时将使用系统注册簿定义的值。显然,程序允许使用者定义访问类型将比由程序内部直接定义要好。因此,要正确使用本程序,必需先在windows系统中定义好网络访问类型,步骤如下:
1、双击桌面上“my computer"图标。
2、点击“contyol panel".
3、点击“internet ”。
4、在随后弹出的对话框中,选“connection"栏,然后填写网络连接属性。如果你是拨号上网,选中“dial”选择项,并填写相关属性。如果你是通过proxy服务器上网,选中“proxy”选项,点击“setting”按钮,设置proxy服务器地址和端口号。如果你是直接连入internet,应使所有的选项均为非选中状态。
本程序在构造CInternetSession对象时使用缺省值,因此,构造函数将不带任何参数。如下所示:
CInternetSession session;
在构造对象session后,我们需写两行程序作一些输出,表示程序已开始工作。
m_out+="正在链接"+URL+"\r\n";
UpdateData(FALSE);
接下来我们使用session对象的成员函数OpenURL()来打开一个URL资源。该函数返回一个文件的指针,文件类型为以下四种之一:
file:// 如果访问的是本地机器,函数返回一个CStudioFile类对象的指针。
ftp:// 如果访问的是一ftp地址,函数返回一个CInternetFile类对象的指针。
gopher:// 如果访问的是一gopher地址,函数返回一个CGopherFile类对象的指针。
http:// 如果访问的是一http地址,函数返回一个CHttpFile类对象的指针。
本程序用于访问远程机器,因此,函数不会返回一个file://类型的本地文件。而CGopherFile和CHttpFile均派生自CInternetFile,所以将该函数返回值赋给CInternetFile类的指针是安全的。当OpenURL()不能正常打开URL资源时,该函数将会抛出一个异常(exception),从而导致程序运行时错误。由于本程序用于探查未知的网址,该网址可能不提供相应服务或根本不存在,因此OpenURL()有时可能不会正常运行。为了避免程序异常终止,我们需使用try-catch结构来处理异常。本段程序代码如下:
CInternetFile* file=NULL;
try
{
file=(CInternetFile*)session.OpenURL(URL);
}
catch(CInternetException* pEx)
{
file=NULL;//如果发生运行时错误,给file赋空值,程序将继续运行
pEx->Delete();
}
通过以上代码,程序将使用用户指定的地址来试图打开Http网址,如果失败,返回的文件为空,程序将继续运行,尝试用其它协议打开网址。随后,无论网址是否成功打开,我们都应作相应输出以提示用户。如果成功,我们用一个for循环读出返回文件的头20句并输出,如果失败,也要给出相应的提示。程序如下:
if(file) file://判定链接是否成功
{
m_out+="已建立链接。\r\n";
Cstring line;
for(int I=0;I<20&&file->ReadString(line);I++)
{
m_out+=line+"\r\n";
}
file->Close();
delete file;
}
else
{
m_out+="本地址没有发现http主机\r\n";
}
m_out+="------------------------------------------------------\r\n";
UpdateData(FALSE);
用于查询的函数编写完后,我们还要给按钮的单击事件增加代码,以便按钮按下时,程序开始查询。给按钮IDC_BUTTON_HTTP按钮增加BN_CLICKEDvoid 消息的代码如下:CQueryDlg::OnQueryHttp()
{
const Cstring http = "http://";
UpdateData(TRUE);
m_out = "";
UpdateData(FALSE);
TryURL(http + m_host);
TryURL(http + "www." + m_host);
}
这段代码中,UpdateData(TRUE)的调用将给m_host赋予用户定义的值。UpdateData(FALSE)语句将清空输出编辑框变量m_out的内容。接下来调用两次TryURL(),例如说,当用户输入yahoo.com,程序将首先试一试http://yahoo.com,然后试一试http://www.yahoo.com。好了,我们现在可以编译程序并执行,输入yahoo.com,程序将连接到internet,并输出yahoo主页的头20行。
实现FTP链接
下面,我们来探讨如何实现FTP链接。首先给对话框类增加一个实现链接的函数TryFTP:
void CQueryDlg::TryFTP(Cstring host)
{
CInternetSession session;
m_out += "正在链接FTP地址 " + host + "\r\n";
UpdateData(FALSE);
CFtpConnection* connection = NULL;
try
{
connection = session.GetFtpConnection(host);
}
catch (CInternetException* pEx)
{
connection = NULL;
pEx->Delete();
}
if (connection)
{
m_out += "已建立链接。 \r\n";
Cstring line;
connection->GetCurrentDirectory(line);
m_out += "缺省目录为 " + line + "\r\n";
connection->Close();
delete connection;
}
else
{
m_out += "本地址没有发现ftp主机 。\r\n";
}
m_out += "------------------------------------------------------\r\n";
UpdateData(FALSE);
}
本函数和TryURL()很相似,不过,它不使用OpenURL()来打开一个文件,而是用GetFtpConnection()来与ftp服务器建立链接。如果链接成功,将使用GetCurrentDirectory()来得到服务器的缺省目录。
大多数ftp地址前有ftp.的前缀,但一些老的地址没有此前缀。现在,给IDC_BUTTON_FTP链接单击消息的处理函数,并编写如下:
void CQueryDlg::OnButtonFtp()
{
UpdateData(TRUE);
m_out = "";
UpdateData(FALSE);
TryFTP(m_host);
TryFTP("ftp." + m_host);
}
现在我们已完成了FPT连接的实现代码。重新编译程序并运行,键入ftp.microsoft.com。可以发现,在ftp.microsoft.com处提供ftp服务。但是你必须有一点耐性,因为在开始查询到出结果将有较长一段时间,因为程序等结果全部探查到后再一次显示,但实际上现在的商业internet程序都是实时显示的。如果我们希望结果实时地显示,必需使用异步套接字(asynchronous sockets)或多线程编程。
实现Gopher查询
GOPHER是一种基于文本的协议,它和WWW相似,可以通过点击文字内容,实现网络内的链接和浏览。但是,GOPHER是通过逐级文字菜单来组织链接和内容的,它不象WWW那样有丰富的多媒体页面。要实现GOPHER查询,我们应给CQueryDlg类增加另一个成员函数void TryGopher(Cstring host)。如果查询成功,该函数将返回查询地址的第一个Gopher位置(locator)。位置是gopher协议的概念,任何gopher客户程序必需先得到一个gopher位置,然后才能进行相应的gopher操作。TryGopher()函数如下:
void CQueryDlg::TryGopher(Cstring host)
{
CInternetSession session;
m_out += "正在链接gopher地址 " + host + "\r\n";
UpdateData(FALSE);
CGopherConnection* connection = NULL;
try
{
connection = session.GetGopherConnection(host);
}
catch (CInternetException* pEx)
{
connection = NULL;
pEx
WinInet编程例子
5星 · 超过95%的资源 需积分: 10 181 浏览量
2010-10-22
08:19:13
上传
评论 1
收藏 45KB RAR 举报
AskaRo2010
- 粉丝: 10
- 资源: 4
最新资源
- Elasticsearch实战:构建高效搜索系统的秘诀.zip
- HTML+CSS+JS网页设计:从入门到精通.zip
- 数据库课程设计:从理论到实践的全面指南.zip
- Python闭包:深入理解与应用场景解析.zip
- Win64OpenSSL-3-3-0.exe
- 课高分程设计-基于C++实现的民航飞行与地图简易管理系统-南京航空航天大学
- 航天器遥测数据故障检测系统python源码+文档说明+数据库(课程设计)
- 北京航空航天大学操作系统课设+ppt+实验报告
- 基于Vue+Echarts实现风力发电机中传感器的数据展示监控可视化系统+源代码+文档说明(高分课程设计)
- 基于单片机的风力发电机转速控制源码
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
- 1
- 2
前往页