用WinInet开发Internet客户端应用指南

LTM4644 四通道并联 16A 输出配置:PCB 布局 3 要点与热仿真验证 本文详细解析了LTM4644四通道并联实现16A输出的PCB布局与热管理要点,包括电流路径对称性设计、热优化布局技巧和接地系统优化。通过实际工程案例,展示了如何确保电流均流、热分布均衡及长期可靠性,为FPGA、ASIC和服务器主板供电设计提供高效解决方案。 阅读详情

编译/NorthTibet

一、概述

    一个Internet客户端程序的目的是通过Internet协议如:HTTP、FTP等来存取网络数据源(服务器)的信息。客户端程序可以访问服务器获得象天气预报,股票价格、重要新闻数据,甚至是与服务器交换信息。Internet客户端程序可以通过外部网络(Internet)或内部网络(一般为Intranet)访问服务器。
    为了开发Internet客户端程序。MFC类库提供了专门的 Win32 Internet 扩展接口,也就是WinInet。MFC将WinInet封装在一个标准的、易于使用的类集合中。在编写WinInet客户端程序时,你既可以直接调用Win32函数,也可以使用WinInet类库。
    Win32 Internet 扩展提供了对普通Internet协议的访问,这些协议包括:HTTP、FTP和Gopher。Gopher已经渐渐淡出。借助于WinInet编程接口,开发人员不必去了解Winsock、TCP/IP和特定Internet协议的细节就可以编写出高水平的Internet客户端程序。WinInet为所有几种协议(HTTP、FTP和Gopher)提供了统一的函数集,也就是Win32 API接口。利用这些统一的函数集,大大简化了针对HTTP、FTP等协议的编程,从而轻松地将Internet集成到自己的应用程序中。底层协议的转换(如从FTP到HTTP)只要对源代码稍作修改就可以完成。
    在Visual C++工程中提供有两种方式来使用WinInet。一种是直接调用Win32 Internet函数,另一种是使用WinInet类库。
    MFC对WinInet的封装是通过提供三个由CStdioFile派生类实现的。这三个派生类是:CInternetFile、 CHttpFile 和 CGopherFile。由于Gopher协议已经很少使用,所以本文将不再对CGopherFile进行讨论。对开发人员来说,不管你以前是否用过CStdioFile,WinInet都是很好理解并且易于使用的。它使得存取Internet数据易如反掌,使得Internet数据和本地数据的处理一致透明,数据的存储位置已经不再重要。

MFC WinInet 类有如下优点:

  • 缓冲器输入输出
  • 数据的类型安全处理
  • 许多函数的参数都是缺省值
  • 对普通的Internet错误进行异常处理
  • 自动清除打开的句柄和连接

使用 WinInet 提供的API函数,你可以:

  • 通过HTTP协议下载HTML页,HTTP协议是专门用于在服务器和客户浏览器之间传输HTML页。
  • 发送FTP请求上传或下载文件以及获取服务器的目录信息。通过匿名登陆下载文件便是FTP的典型应用。
  • 其它基于HTTP、FTP协议的应用。

使用 WinInet 的一般流程为:



        图一

下表描述了一个Internet客户端程序实现的一般步骤:
(表一)

实现方法
建立一个连接创建CInternetSession对象,它是WinInet Internet客户应用的前提条件
打开一个URL建立一个连接,调用CInternetSession::OpenURL
函数,返回一个只读资源对象
读取 URL 数据打开一个URL,调用CInternetSession::QueryOption
查询 Internet 选项设置 建立一个连接,调用CInternetFile::Read
设置一个Internet选项建立一个连接,调用CInternetSession::SetOption
设置一个用状态信息调用的函数建立一个连接,调用CInternetSession::EnableStatusCallback
重写CInternetSession::OnStatusCallback函数
关闭连接用CInternetSession对象方法,清除打开的连接

为了创建Internet客户端程序,MFC提供了如下的C++类和全程函数:

C++类

CInternetSession (父类 CObject)
CInternetConnection (父类 CObject)
    CFtpConnection
    CGopherConnection
    CHttpConnection
CInternetFile(父类 CStdioFile)
    CGopherFile
    CHttpFile
CFileFind(父类 CObject)
    CFtpFileFind
    CGopherFileFind
CGopherLocator(父类 CObject)
CInternetException(父类 CException)      

全程函数:

AfxParseURL
AfxGetInternetHandleType
AfxThrowInternetException    

    这些类和全程函数除CFileFind在AFX.H里声明之外,其余都在AFXINET.H文件里声明。它们对HTTP、FTP和Gopher等协议进行了高度抽象,形成了一套高级API函数。 利用这些API可以快速直接地开发Internet应用。例如,连接到FTP服务器一般需要几个步骤,而且需要做一些底层处理。但使用上述的MFC类提供的API,只需要对CInternetSession::GetFTPConnection进行一次调用,便可以轻松建立连接。
    大家知道,每一个Internet应用其数据交换都是建立在Internet会话(Session)的基础之上的,MFC是通过CInternetSession类对象来实现Internet会话的。用这个类不仅可以创建会话,而且可以创建几个并发的Internet会话。
    为了与服务器进行通讯,除了要创建CInternetSession对象之外,还必须创建CInternetConnection对象,针对不同的协议,CInternetConnection对象有三种类型:

  • CInternetSession::GetFtpConnection
  • CInternetSession::GetHttpConnection
  • CInternetSession::GetGopherConnection

这些函数调用并不会读写服务器上的文件。如果你想要读写数据,必须要打开文件才能操作。其处理流程应该是这样的:

  • 首先创建 CInternetSession 对象实例
  • 如果创建的Session要读写文件,则必须创建 CInternetFile 对象实例(或者是它的子类CHttpFile、CGopherFile 对象实例)。其实,读取数据最容易的方式是调用 CInternetSession::OpenURL函数。 这个函数解析你提供的统一资源定位符(URL),然后打开与URL指定的服务器连接,同时返回一个只读的CInternetFile对象。CInternetSession::OpenURL不针对特定的协议类型——不管是FTP还是HTTP都可以调用,它甚至可以处理本地文件,此时返回的是CStdioFile,而不是CInternetFile。  
  • 如果创建的Session不读写文件,而是要实现其它的任务,如删除某个FTP目录下的文件等,则你不需要创建CInternetFile实例。

创建CInternetFile对象的方法有两种:

  • 如果用CInternetSession::OpenURL建立与服务器的连接,调用返回CStdioFile。
  • 如果用CInternetSession::GetFtpConnection、GetGopherConnection或者CHttpConnection::OpenRequest建立与服务器的连接,你必须调用相应的CFtpConnection::OpenFile、CGopherConnection::OpenFile或者CHttpConnection::OpenRequest,返回的内容也与CInternetFile、CGopherFile或者CHttpFile对应。

    综上所述,实现Internet客户端应用的步骤因协议而异。要看你是创建基于OpenURL的一般Internet客户端应用,还是使用GetXXXConnection函数之一针对特定协议的Internet客户端应用。

二、实现步骤

    大家知道,每个Internet客户端程序都伴随有一定的目的行为,如读文件、写文件、删除文件等等。客户端的程序要实现这些行为的先决条件是建立Internet连接。然后再根据不同的目的进行具体的操作。为了方便起见,下面这这些张表格针对不同的应用行为列出了所需要的具体操作。其中列出了一般的Internet URL (FTP、或者 HTTP)客户端行为要实现某个目标所必须使用的方法。这张表格的内容来自MSDN。我对部分我认为重要的地方做了补充。

(表一)一个典型的Internet客户端程序的处理流程

目的方法结果
开始一个Internet session创建 CInternetSession 对象初始化WinInet,并连接服务器
读取或设置 InternetQuery 选项 (如超时或重试次数)调用 CInternetSession::SetOption不成功返回FALSE
建立回调函数监视session状态调用CInternetSession::EnableStatusCallback
建立回调函数
CInternetSession::OnStatusCallback,重写OnStatusCallback,创建自己的回调例程
Internet服务器Intranet服务器或本地文件调用 CInternetSession::OpenURL解析并打开到指定服务器的连接,返回CStdioFile(如果你传递的OpenURL是本地文件名)或CInternetFile对象,通过存取这个对象,获得服务器或文件的数据
读文件调用 CInternetFile::Read用你提供的Buffer读指定的字节数
异常处理在 CInternetException 类中处理处理所有普通的 Internet 异常类型
结束 Internet session 处理CInternetSession对象自动清除打开的句柄的连接

(表二)典型的 FTP 客户端程序实现的一般步骤
目的方法结果
开始一个FTP会话,建立一个FTP连接创建一个CInternetSession对象,调用CInternetSession::GetFtpConnection初始化WinInet
并联接服务器
连接到一个FTP Server用CInternetSession::GetFtpConnection返回一个CFtpConnection对象
CD到 FTP 服务器的一个新目录用CFtpConnection::SetCurrentDirectoryCD到FTP服务器的一个
新目录
Find 第一个FTP目录中的文件创建一个CFtpFileFind对象,调用CFtpFileFind::FindFile,OpenURL函数返回一个只读资源对象;调用CFtpFileFind::FindFileFind第一个文件,如果文件每找到返回FALSE
枚举所有可获得的资源,Find下一个FTP目录中的文件Find下一个资源,调用CFtpFileFind::FindNextFile直到返回FALSE。Find下一个文件
如果文件没找到返回FALSE
打开FindFile或FindNextFile找到的文件(用于读写)调用CFtpConnection::OpenFile,参数为FindFile或FindNextFile返回的文件名 ,创建并打开一个CInternetFile对象打开FindFile或FindNextFile找到的文件(用于读写),返回一个CInternetFile对象
读写文件以读方式打开FTP文件,用CInternetFile::Read使用你指定的缓冲读
指定的字节数
写FTP文件以写方式打开FTP文件,调用CInternetFile::Write,重写CInternetSession::OnStatusCallback使用你指定的缓冲写
指定的字节数
改变客户端在服务器上的目录调用CFtpConnection::SetCurrentDirectory进入新的目录
获取客户端在服务器上的当前目录调用CFtpConnection::GetCurrentDirectory获取目录信息
异常处理用CInternetException类 处理所有普通的Internet异常类型
结束FTP session处理CInternetSession对象自动清除打开的句柄的连接

(表三)显示了一个典型的删除文件的FTP客户端应用要实现的一般步骤:
目的方法结果
开始一个FTP session创建一个CInternetSession对象初始化WinInet
并联接服务器
连接到一个FTP Server用CInternetSession::GetFtpConnection返回一个CFtpConnection对象
检查FTP目录是否正确用CFtpConnection::GetCurrentDirectory或CFtpConnection::GetCurrentDirectoryAsURL 返回目录名字
服务器目录或返回目录的URL
CD(改变目录)到 FTP 服务器的一个新目录用CFtpConnection::SetCurrentDirectoryCD到FTP服务器的一个
新目录
Find 第一个FTP目录中的文件用CFtpFileFind::FindFileFind第一个文件,如果文件每找到返回FALSE
Find 下一个FTP目录中的文件用CFtpFileFind::FindNextFileFind下一个文件
如果文件没找到返回FALSE
删除FindFile或FindNextFile找到的文件 用CFtpConnection::Remove用FindFile或FindNextFile返回的文件名删除FindFile或FindNextFile
找到的文件    
异常处理用CInternetException类 处理所有普通的Internet异常类型
结束FTP session处理CInternetSession对象自动清除打开的句柄的连接

(表四)显示了实现一个典型的 HTTP 客户端应用程序的一般步骤:
目的方法结果
开始HTTP会话,建立HTTP连接 创建 CInternetSession对象,调用CInternetSession::GetHttpConnection
创建CHttpConnection对象
初始化WinInet并联接服务器,返回一个CHttpConnection对象
创建一个 HTTP 请求调用CHttpConnection::OpenRequest
创建一个CHttpFile对象;
返回一个CHttpFile对象
发送一个HTTP 请求用CHttpFile::AddRequestHeaders 并且用CHttpFile::SendRequestFind一个文件
如果文件没找到返回FALSE
读文件调用CInternetFile::Read使用你提供的缓冲读指定的字节
获取HTTP请求信息调用CHttpFile::QueryInfo从服务器获取HTTP请求头信息
异常处理利用CInternetException类处理所有普通的Internet异常类型
结束 HTTP 会话处理CInternetSession对象自动清除打开的句柄的连接

   由于时间关系,我没有写本文的例子代码。不过MSDN里有两个简单的例子可以参考,一个是FTPTREE,另一个是TEAR。此外,也可以用“WinInet”作为关键字在google里搜一下也能找到一些使用MFC WinInet的技术信息。

外设高级定时器互补输出带死区控制实验 阅读详情

相关推荐

MATLAB & Simulink 支持包 for Arduino 硬件(离线安装)

本资源提供了MATLAB及Simulink针对Arduino硬件的支持包,专为那些需要在没有网络连接环境下进行安装的用户设计。通过这个支持包,您可以轻松地在MATLAB和Simulink环境中开发、模拟和部署代码到您的Arduino设备上,从而充分利用这两个强大的软件平台进行嵌入式系统的设计与实验。特性兼容性强:适用于多种Arduino板,包括但不限于Uno、Mega、Nano以及Leonardo等。无缝集成:直接在MATLAB界面内编写、调试和上传代码至Arduino。图形化编程:利用Simulink,无需编写代码即可实现复杂系统的仿真和开发。广泛库支持:包含一系列预构建的库和模块,便于快速访问Arduino的传感器和执行器。教育与科研:非常适合于学术研究、工程教学和创新项目,简化了从概念到实体验证的过程。安装指南下载资源:首先,确保您已经下载了本页面提供的离线安装包。关闭MATLAB:在开始安装之前,请确保MATLAB已完全关闭。运行安装程序:找到下载的安装包,双击启动安装过程。跟随向导:按照屏幕上的指示完成安装步骤。可能需要指定MATLAB安装路径。重启MATLAB:安装完成后,重新启动MATLAB。验证安装:打开MATLAB,通过搜索“Arduino”来检查支持包是否成功安装并可用。

WinInet使用详解

WinInet是windows平台对socket进行一层封装,用来直接处理http/ftp/Gopher协议的一套windows API。我第一次接触这个是在一个客户那里,当时因为客户都需要使用http代理才能浏览网页,所以折腾了一天,才基本掌握。而时隔没多久又忘记的差不多了,这个流程就像正则表达式一样,常学常忘,常忘常学。而网络上流传的WinInet代码实例,不是编译不通过,就是粗制滥造。因此现

左雪菲的专栏 2万+

易语言设置浏览器控件代理例程

易语言设置浏览器控件代理例程源码,设置浏览器控件代理例程,设置代理服务器,InternetSetOptionA2,InternetSetOptionA

python设置internet_使用Python在Windows中设置代理设置(使用InternetSetOption)

事实上,我自己通过大量的尝试和错误发现了这一点。工作示例:from ctypes import *from ctypes.wintypes import *LPWSTR = POINTER(WCHAR)HINTERNET = LPVOIDINTERNET_PER_CONN_PROXY_SERVER = 2INTERNET_OPTION_REFRESH = 37INTERNET_OPTION_SET...

weixin_33402252的博客 1185

WinInet

1、WinInet 是一个网络编程接口,包含了 Internet 底层协议 HTTP,FTP。 2、借助 WinInet 接口,可不必去了解 Winsock、TCP/IP 和特定 Internet 协议 的细节就可以编写出高水平的 Internet 客户端程序。 3、WinInet 为 HTTP、FTP 提供了统一的函数集,也就是 Win32 API 接口。 4、WinInet 简化了 H

txj236的专栏 1071

InternetSetOption 网络API

InternetSetOption函数     用到的变量     -------------------------------------------------    Private   Const   INTERNET_OPTION_CONNECTED_STATE   =   50     Private   Const   INTERNET_STATE_DISCONNECTED_

SImonJ07的记事本 5223

WinInet和winHttp库使用简介

winhttp和wininet简介 http qt c++

qq_45543503的博客 1559

python设置internet_在Windows中使用Python设置代理设置(使用InternetSetOption)

fromctypesimport*fromctypes.wintypesimport*LPWSTR=POINTER(WCHAR)HINTERNET=LPVOIDINTERNET_PER_CONN_PROXY_SERVER=2INTERNET_OPTION_REFRESH=37INTERNET_OPTION_SETTINGS_CHANGED=39INTERNET_OPTION_PER_CONNECT...

weixin_39616855的博客 483

WinInet随笔

Wininet是微软提供的利用FTP、HTTP协议访问Internet资源的API接口,接口处理底层协议的的变化,例如代理服务器,从而使利用winiet的应用程序具有一直的行为。使用Wininet最知名的程序就是IE,而很多第三方应用也使用它来方位互联网。最近做了些工作,特记录下一些随笔。 Wininet利用HINTERNET句柄保存协议相关信息,并且HINTERNET句柄以树状的形式保存,其中

xbgprogrammer的专栏 2156

Internet API 使用代理

1.  相关函数:  HINTERNET  WINAPI  InternetOpen(    LPCTSTR  lpszAgent,      DWORD  dwAccessType,      LPCTSTR  lpszProxy,      LPCTSTR  lpszProxyBypass,      DWORD  dwFlags);     BOOL  WINAPI  InternetSe

章志强的专栏 2318

网络连接的获取,禁用,启用(VC++)

MFC工程下使用方式: #include <NetCon.h> void OnNetTest() { INetConnectionManager *pNetManager; INetConnection *pNetConnection; IEnumNetConnection *pEnum; do { CoInitialize(...

蓦然回首 2732
上一篇: 程序风格的要素-C++风格指南
下一篇: 新的一年,新的起点
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值