WinInet编程详解
一般而言,开发Internet服务客户端程序的目的是通过Internet协议(HTTP,FTP)获取网络数据源的信息,微软提供了专门的Win32 Internet扩展接口,也就是WinInet。
1使用Win API函数开发客户端程序
一般流程是,首先通过InternetOpen()函数创建位于根部的HINTERNET句柄,然后才能进一步建立HTTP、FTP会话,使用InternetConnect()函数创建一个指定的会话,初始化HTTP、FTP会话(根据指定的参数决定),并创建一个根句柄的分支,HttpOpenRequest()、FtpOpenFile()、FtpFindFirstFile()等函数将使用InternetConnect()所创建的句柄,建立到指定站点的连接。例子代码如下:
bool testFtpDownload ()
{
// 建立会话
HINTERNET hInternet;
hInternet = InternetOpen("", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(hInternet == NULL) return false;
// 建立连接
HINTERNET hConnect;
hConnect = InternetConnect(hInternet, "112.128.125.11", INTERNET_INVALID_PORT_NUMBER,
"", "", INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
if(hInternet == NULL) { InternetCloseHandle(hInternet); return false; }
HINTERNET hFtpFile;
hFtpFile = FtpOpenFile(hConnect, "common/ Essential C++中文版.pdf", GENERIC_READ, FTP_TRANSFER_TYPE_BINARY|INTERNET_FLAG_RELOAD, NULL);
if(hFtpFile == NULL) { InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); return false; }
char buf[1024];
DWORD buf_len = 1024;
DWORD buf_read = 1024;
FILE *fp = fopen("e:\\test.pdf", "wb");
while(1)
{
InternetReadFile(hFtpFile, buf, buf_len, &buf_read);
if(buf_read == 0) break;
fwrite(buf, 1, buf_read, fp);
}
fclose(fp);
InternetCloseHandle(hFtpFile);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
return true;
}
bool testHttpDownload()
{
// 建立会话
HINTERNET hInternet;
hInternet = InternetOpen("", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
if(hInternet == NULL) return false;
// 建立连接
HINTERNET hConnect;
hConnect = InternetConnect(hInternet, "hi.baidu.com", INTERNET_INVALID_PORT_NUMBER,
"", "", INTERNET_SERVICE_HTTP, INTERNET_FLAG_PASSIVE, 0);
if(hInternet == NULL) { InternetCloseHandle(hInternet); return false; }
HINTERNET httpFile;
httpFile = HttpOpenRequest(hConnect, "GET", "vc_net/blog/item/2d830208fe388bc063d986b2.html", HTTP_VERSION, NULL, 0, INTERNET_FLAG_NO_UI | INTERNET_FLAG_DONT_CACHE, 1);
if(httpFile == NULL) { InternetCloseHandle(hConnect); InternetCloseHandle(hInternet); return false; }
HttpSendRequest(httpFile, NULL, NULL, 0, 0);
char buf[1024];
DWORD buf_len = 1024;
DWORD buf_read = 1024;
FILE *fp = fopen("e:\\test.txt", "wb");
while(1)
{
InternetReadFile(httpFile, buf, buf_len, &buf_read);
if(buf_read == 0) break;
fwrite(buf, 1, buf_read, fp);
}
fclose(fp);
InternetCloseHandle(httpFile);
InternetCloseHandle(hConnect);
InternetCloseHandle(hInternet);
return true;
}
2.使用mfc类开发客户端程序
网络客户端开发的要点是Internet Session,而mfc将Internet Session作为CInternetSession类的对象来实现,需要包含头文件#include <afxinet.h>
大多数Internet Session都需要与服务器进行读写数据的操作,这就需要CInternetSession对象与一个CInternetFile对象的协同工作,即必须创建一个CInternetFile实例或者其子类CHttpFile的对象。创建CInternetFile对象有两种方法:
1)直接调用CInternetSession::OpenURL函数,该函数打开一个到URL的连接,并返回一个只读的CInternetFile对象.它还可以操作本地文件(由URL资源“file://”标志),但是返回一个CStdioFile对象。
2)调用相应服务协议类的打开函数
通过CInternetSession::GetHttpConnection, CInternetSession::GetFtpConnection建立的服务器连接对话,则必须调用CHttpConnection::OpenRequest,CFtpConnection::OpenFile函数,返回一个CHttpFile、CFtpFile对象。
2.1使用WinInet访问HTTP服务器
最简单的方法是创建CInternetSession对象,以HTTP站点的URL参数调用OpenURL(),返回一个CInternetFile文件句柄,以此句柄操作文件。例如代码如下:
bool DownloadHtml(const string& url, const string& filename)
{
char buf[1000];
FILE* fp = fopen(filename.c_str(),"wb");
if (NULL == fp)
return false;
DWORD nRead = 0;
CInternetSession localsession;
CInternetFile* webfile = NULL;
try
{
webfile = (CInternetFile*)localsession.OpenURL(url.c_str());
}
catch(CInternetException* pException)
{
webfile = NULL;
pException->Delete();
}
while((nRead = webfile->Read(buf,1000)) > 0)
fwrite(buf, 1, nRead, fp);
fclose(fp);
delete webfile;
localsession.Close();
return true;
}
2.2使用WinInet访问FTP服务器
常使用CFtpConnection类,具体方法如下:
调用函数CInternetSession::GetFtpConnection()建立连接,该函数所需的参数依次为FTP站点域名、用户名、密码、FTP服务端口号(缺省为21)、访问模式(被动或主动)。
连接建立完成后,用CFtpConnection类的方法操作远程FTP服务器的文件系统,具体如下:
SetCurrentDirectory(GetCurrentDirectory)设置(获取)此连接的FTP目录。
RemoveDirectory(CreateDirectory)删除(创建)目录
Rename、Remove、PutFile、GetFile、OpenFile等对文件进行更名、删除、上传、下载及打开等操作。
用Close函数关闭与FTP服务器的连接。
例子代码如下:
bool DownloadFile(const string& url, const string& filename)
{
CInternetSession localsession(L"my session");
CFtpConnection* ftp= localsession.GetFtpConnection(L"122.118.125.11",L"",L"",21);
// ftp->GetFile(L"test/信息.txt",L"e:\\tt.txt");
ftp->PutFile(L"e:\\tjl.txt",L"common/test.txt");
ftp->Close();
localsession.Close();
return true;
}
WinInet编程详解相关推荐
- PHP SOCKET编程详解
这篇文章主要介绍了PHP SOCKET编程详解,需要的朋友可以参考下 1. 预备知识 一直以来很少看到有多少人使用php的socket模块来做一些事情,大概大家都把它定位在脚本语言的范畴内吧,但是其实 ...
- iOS-NSThread编程详解
note:文明看帖转载是对自己的尊重也是对学者的鼓励,欢迎批评讨论 iOS多线程-NSThread编程详解 再iOS开发中存在三种比较常用的实现多线程编程的方法,NSThread,NSOperatio ...
- Linux网络编程---详解TCP
Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...
- MFC下CSocket编程详解
MFC下CSocket编程详解: 1. 常用的函数和注意事项(详细的函数接口说明请查看MSDN): CSocket::Create 初始化(一般写服务器程序都不要用为好,用下面的 CSocket:: ...
- Linux串口编程详解
Linux串口编程详解(阻塞模式.非阻塞模式.select函数) 之前一直觉得串口编程很简单,这两天仔细研究后发现串口里的各种参数还挺复杂,稍不注意就容易出错,这里总结一下网上的各种文章及自己的理解与 ...
- [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...
[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...
- [进阶] --- Python3 异步编程详解(史上最全篇)
[进阶] - Python3 异步编程详解:https://blog.csdn.net/lu8000/article/details/45025987 参考:http://aosabook.org/e ...
- Java高并发编程详解系列-Java线程入门
根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面. 首先介绍一下这个系列的东西是什么,这个系列自己 ...
- java程序的界面编程详解
java程序的界面编程详解 在Java中可以为程序自定义程序界面选择Windows.Unix.Java或Macintosh外观.甚至可以在程序运行时让用户自由的选择外观. UIManager和Swin ...
最新文章
- 大数据会消灭律师这一职业吗?
- 基于 RT-Thread的全向赛车算法开发
- idea 在tomcat中部署的时候 莫名其妙的错误
- 神策 FM | 数据驱动时代,你的岗位如何转变?
- vco为什么低频下起振困难_为什么开放如此困难?
- 算法之最长公共子序列(LCS)问题
- 开源数字媒体资产管理系统:Razuna安装方法
- 建立ssh隧道_快速掌握 SSH 端口转发,助力远程工作
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_5_BufferedWriter_字符缓冲输出流...
- 怎么设置creative cloud的应用禁止自动更新
- 欧拉计划第80题:平方根数字展开
- 泊松过程的概念及其例题分析
- 金融系列-会计基础知识
- 台式电脑主板插线步骤图_电脑主板跳线插法 装机接线详细图解教程
- start with connect by prior用法
- Grid:网格布局基础简述
- 永劫无间为啥显示连接服务器失败,永劫无间服务器故障原因-永劫无间服务器连接失败解决方法_游戏369...
- 黑盒测试用例的设计方法有哪些
- 图像去模糊算法代码实践!
- java两个数之间质数求法_java用递归筛选法求N以内的孪生质数(孪生素数)
热门文章
- Android float 四舍五入没有入的一个问题
- Go指南练习_rot13Reader
- zabbix聚合图形创建脚本
- Linux的shell scripts
- java Cache框架
- Unix Domain Socket 域套接字实现
- ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
- Exchange Server 2010安装
- 对于数据库中表示状态或类型字段表示方法的思考
- 消息队列系列(二):.Rabbitmq的使用及Web监控工具使用