一般而言,开发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编程详解相关推荐

  1. PHP SOCKET编程详解

    这篇文章主要介绍了PHP SOCKET编程详解,需要的朋友可以参考下 1. 预备知识 一直以来很少看到有多少人使用php的socket模块来做一些事情,大概大家都把它定位在脚本语言的范畴内吧,但是其实 ...

  2. iOS-NSThread编程详解

    note:文明看帖转载是对自己的尊重也是对学者的鼓励,欢迎批评讨论 iOS多线程-NSThread编程详解 再iOS开发中存在三种比较常用的实现多线程编程的方法,NSThread,NSOperatio ...

  3. Linux网络编程---详解TCP

    Linux网络编程---详解TCP的三次握手和四次挥手_shanghx_123的博客-CSDN博客_tcp的协议数据单元被称为 TCP协议详解(TCP报文.三次握手.四次挥手.TIME_WAIT状态. ...

  4. MFC下CSocket编程详解

    MFC下CSocket编程详解:  1. 常用的函数和注意事项(详细的函数接口说明请查看MSDN): CSocket::Create 初始化(一般写服务器程序都不要用为好,用下面的 CSocket:: ...

  5. Linux串口编程详解

    Linux串口编程详解(阻塞模式.非阻塞模式.select函数) 之前一直觉得串口编程很简单,这两天仔细研究后发现串口里的各种参数还挺复杂,稍不注意就容易出错,这里总结一下网上的各种文章及自己的理解与 ...

  6. [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功)...

    [顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之功) 原文:[顶]ORACLE PL/SQL编程详解之二:PL/SQL块结构和组成元素(为山九仞,岂一日之 ...

  7. [进阶] --- Python3 异步编程详解(史上最全篇)

    [进阶] - Python3 异步编程详解:https://blog.csdn.net/lu8000/article/details/45025987 参考:http://aosabook.org/e ...

  8. Java高并发编程详解系列-Java线程入门

    根据自己学的知识加上从各个网站上收集的资料分享一下关于java高并发编程的知识点.对于代码示例会以Maven工程的形式分享到个人的GitHub上面.   首先介绍一下这个系列的东西是什么,这个系列自己 ...

  9. java程序的界面编程详解

    java程序的界面编程详解 在Java中可以为程序自定义程序界面选择Windows.Unix.Java或Macintosh外观.甚至可以在程序运行时让用户自由的选择外观. UIManager和Swin ...

最新文章

  1. 大数据会消灭律师这一职业吗?
  2. 基于 RT-Thread的全向赛车算法开发
  3. idea 在tomcat中部署的时候 莫名其妙的错误
  4. 神策 FM | 数据驱动时代,你的岗位如何转变?
  5. vco为什么低频下起振困难_为什么开放如此困难?
  6. 算法之最长公共子序列(LCS)问题
  7. 开源数字媒体资产管理系统:Razuna安装方法
  8. 建立ssh隧道_快速掌握 SSH 端口转发,助力远程工作
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_5_BufferedWriter_字符缓冲输出流...
  10. 怎么设置creative cloud的应用禁止自动更新
  11. 欧拉计划第80题:平方根数字展开
  12. 泊松过程的概念及其例题分析
  13. 金融系列-会计基础知识
  14. 台式电脑主板插线步骤图_电脑主板跳线插法 装机接线详细图解教程
  15. start with connect by prior用法
  16. Grid:网格布局基础简述
  17. 永劫无间为啥显示连接服务器失败,永劫无间服务器故障原因-永劫无间服务器连接失败解决方法_游戏369...
  18. 黑盒测试用例的设计方法有哪些
  19. 图像去模糊算法代码实践!
  20. java两个数之间质数求法_java用递归筛选法求N以内的孪生质数(孪生素数)

热门文章

  1. Android float 四舍五入没有入的一个问题
  2. Go指南练习_rot13Reader
  3. zabbix聚合图形创建脚本
  4. Linux的shell scripts
  5. java Cache框架
  6. Unix Domain Socket 域套接字实现
  7. ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: NO)
  8. Exchange Server 2010安装
  9. 对于数据库中表示状态或类型字段表示方法的思考
  10. 消息队列系列(二):.Rabbitmq的使用及Web监控工具使用