??xml version="1.0" encoding="utf-8" standalone="yes"?>91亚洲精品一区二区,国产精品香蕉av,国产九区一区在线http://www.aygfsteel.com/jjshcc/category/45665.html桑巴葡语译工作室是q州?jng)最专业葡萄牙语译机构-www.puyufanyi.com-Ƣ迎LJava,As400,Mainframe的猎头eric_cc#qq.ccom(?换成@)zh-cnMon, 11 Aug 2014 18:26:12 GMTMon, 11 Aug 2014 18:26:12 GMT60ZWindows Server 2012 r2环境部vSharePoint 2013 SP1http://www.aygfsteel.com/jjshcc/archive/2014/08/11/416816.htmlEric_jiangEric_jiangMon, 11 Aug 2014 08:15:00 GMThttp://www.aygfsteel.com/jjshcc/archive/2014/08/11/416816.htmlhttp://www.aygfsteel.com/jjshcc/comments/416816.htmlhttp://www.aygfsteel.com/jjshcc/archive/2014/08/11/416816.html#Feedback0http://www.aygfsteel.com/jjshcc/comments/commentRss/416816.htmlhttp://www.aygfsteel.com/jjshcc/services/trackbacks/416816.html阅读全文

Eric_jiang 2014-08-11 16:15 发表评论
]]>
WinINet 学习(fn)资料http://www.aygfsteel.com/jjshcc/archive/2010/07/21/326728.htmlEric_jiangEric_jiangWed, 21 Jul 2010 04:57:00 GMThttp://www.aygfsteel.com/jjshcc/archive/2010/07/21/326728.htmlhttp://www.aygfsteel.com/jjshcc/comments/326728.htmlhttp://www.aygfsteel.com/jjshcc/archive/2010/07/21/326728.html#Feedback1http://www.aygfsteel.com/jjshcc/comments/commentRss/326728.htmlhttp://www.aygfsteel.com/jjshcc/services/trackbacks/326728.htmlWinINet
WinINet不是l服务端用的Q服务端用Microsoft Windows HTTP Services (WinHTTP)
WinINet抽象?jin)GopherQFTPQHTTP协议的一些细节?/div>
2.HINTERNET 句柄

WinINet函数创徏、用的句柄都是HINTERNETcd的,q种cd的句柄无法被转换成其 它类型的句柄。换句话_(d)最好别用ReadFile、CloseHandle之类的函数来操作q些句柄。同L(fng)Q也别用WinINet函数来访问、操作其 他类型的句柄。比如,用InternetReadFile讉KCreateFile创徏句柄是无法得C惌的结果的。想关闭HINTERNET句柄要 用InternetCloseHandle函数?/h4>

3.句柄架构



InternetOpen 创徏的句柄在层Q由接下来的一层的 InternetOpenUrl ?InternetConnect 使用Q?InternetConnect 创徏的句柄又被之后的几个函数使用?/p>

下面q张图是依赖 InternetOpenUrl 创徏的句柄的几个函数Q灰色的Ҏ(gu)是返?HINTERNET 句柄的函敎ͼ而白色的框就是用被创徏?HINTERNET 句柄的函?/p>



FTP Hierarchy






HTTP Hierarchy






注意q张图,q张囄意思是 HttpSendRequestEx 先访?HttpOpenRequest 创徏的句柄之后, HttpEndRequest, InternetReadFileEx ?InternetWriteFile 才能讉Kq个句柄?HttpEndRequest 被调用之后,才轮的到InternetReadFile, InternetSetFilePointer ?InternetQueryDataAvailable 来访问这个句柄?/p>

4.内容~码

HTTP 协议 (RFC 2616) 规定?jin)应用程序可以要求服务器用编码的方?encoded format)q回HTTP响应。在Windows Server 2008 ?Windows Vista之前Q发送给应用E序的内容编码了(jin)的请求需要应用程序自己处理,从Windows Server 2008 and Windows Vista开? 应用E序可以?WinINet 来解码了(jin)Qgzip与deflateQ。有三种方式开启解码选项Q基于会(x)话、请求、连接)(j)Q它们的作用域不同。可以?a >InternetOpen(Z?x)?, InternetConnect(Zq接), HttpOpenRequest(Zh)q回的句柄调?a >InternetSetOption 来打开或关闭解码选项,打开则将 dwOption 参数中INTERNET_OPTION_HTTP_DECODING 选项打开, ?lpBuffer 指向一个ؓ(f)true的boolean变量. 关闭?em>dwOption 参数中INTERNET_OPTION_HTTP_DECODING 选项打开, ?lpBuffer 指向一个ؓ(f)false的boolean变量 .

讄解码选项之后Q?WinInet 在你调用 InternetReadFile 是就?x)执行一ơ解码。不q就你打开?jin)解码选项Q它也不一定就Z解码……当这U情况发生时Q?InternetReadFile 函数?x)失败ƈq回ERROR_INTERNET_DECODING_FAILED.q个时候你可以选择LAccept-Encoding头重新发送一ơ请求,或者把解码x(chng)然后自己来解码(q时你就得检查Content-Encoding头来判断~码方式?jin)?j)?/p>

5.协议无关函数

Function Description
InternetFindNextFile l箋(hu)文g的枚举或搜烦(ch). 需要以下函数创建的句柄 FtpFindFirstFile, GopherFindFirstFile, InternetOpenUrl
InternetLockRequestFile 允许用户锁定文g. 需要以下函数创建的句柄 FtpOpenFile, GopherOpenFile, HttpOpenRequest, InternetOpenUrl .
InternetQueryDataAvailable 查询可用数据的数? 需要以下函数创建的句柄 FtpOpenFile, GopherOpenFile, HttpOpenRequest .
InternetQueryOption 查询 Internet 讄.
InternetReadFile d URL 数据. 需要以下函数创建的句柄 InternetOpenUrl, FtpOpenFile, GopherOpenFile, HttpOpenRequest .
InternetSetFilePointer 讄文g指针. 需要以下函数创建的句柄 InternetOpenUrl ( HTTP URL only) HttpOpenRequest (GET Ҏ(gu)).
InternetSetOption 配置 Internet 讄.
InternetSetStatusCallback 讄一个接收状态信息的回调函数. 分配一个回调函数给指定?HINTERNET 句柄?qing)从其演化而来的句?
InternetUnlockRequestFile 解锁?InternetLockRequestFile 锁定的文?

L?/font>

函数 InternetReadFile 用来从一个由函数 InternetOpenUrl, FtpOpenFile, GopherOpenFile, HttpOpenRequest q回?HINTERNET 句柄下蝲资源.

WinINet 提供?jin)两U方法来下蝲整个资源

L文g

先?FtpFindFirstFile, GopherFindFirstFile, ?InternetOpenUrl Q然后将其返回的句柄作ؓ(f)参数 传递给 InternetFindNextFile q行l箋(hu)查找Q持l调?InternetFindNextFile 知道q回扩展的错误信?ERROR_NO_MORE_FILES 来完成整个搜索,调用 GetLastError 来获取最后的错误信息.

6.HTTP ?x)?br />



使用 WinINet 函数讉KWWW资源

(1)初始?WWW q接

服务类型设?INTERNET_SERVICE_HTTP 调用 InternetConnect 来徏立一?HTTP ?x)?/font>

HINTERNET InternetConnect(
__in HINTERNET hInternet, //InternetOpen q回的句?br /> __in LPCTSTR lpszServerName, //可以描述目标服务器的字符?br /> __in INTERNET_PORT nServerPort,//目标服务器的端口
__in LPCTSTR lpszUsername,//用户?br /> __in LPCTSTR lpszPassword,//密码
__in DWORD dwService,//使用的服务类?br /> __in DWORD dwFlags,
__in DWORD_PTR dwContext
);
nServerPort
Value Meaning

INTERNET_DEFAULT_FTP_PORT

Uses the default port for FTP servers (port 21).

INTERNET_DEFAULT_GOPHER_PORT

Uses the default port for Gopher servers (port 70).

INTERNET_DEFAULT_HTTP_PORT

Uses the default port for HTTP servers (port 80).

INTERNET_DEFAULT_HTTPS_PORT

Uses the default port for Secure Hypertext Transfer Protocol (HTTPS) servers (port 443).

INTERNET_DEFAULT_SOCKS_PORT

Uses the default port for SOCKS firewall servers (port 1080).

INTERNET_INVALID_PORT_NUMBER

Uses the default port for the service specified by dwService.

ldwService
Value Meaning

INTERNET_SERVICE_FTP

FTP service.

INTERNET_SERVICE_GOPHER

Gopher service.

INTERNET_SERVICE_HTTP

HTTP service.

(2)建立h

调用 HttpOpenRequest 来徏立一?HTTP hQ不q这个函C?x)自动把h发送出去,要发送请求需要调?HttpSendRequest

HttpOpenRequest 原型


HINTERNET HttpOpenRequest(
__in HINTERNET hConnect, // InternetConnect 函数q回的句?br /> __in LPCTSTR lpszVerb, // 动作Q有GET, PUT, POST。也可以讄?NULL Q会(x)被当成默认的 GET 来用
__in LPCTSTR lpszObjectName, // 一个描qCh资源的字W串Q当h一个默认页面时令这个参数指向一个空?br /> __in LPCTSTR lpszVersion, // HTTP 版本Q这个参Cؓ(f) NULL Ӟ默认使用""HTTP/1.1""
__in LPCTSTR lpszReferer, // 说明?jin)lpszObjectName是取自哪个文Ӟ可以设ؓ(f)NULL
__in LPCTSTR *lplpszAcceptTypes, //
是一个指?/font>LPCTSTR数组的指针!数组以一个NULL指针l束?/em>指定?jin)程序接受的内容的类型,设?f)I则不接?Mcd的内容,设ؓ(f)IZ则等价于""text/*""Q即不接受文本文件以外的囄{文Ӟ只接受某U特定的文g可以用类?image/gif, image/jpeg"的方式。关于更多内容类?L(fng)q里
__in DWORD dwFlags, // 一般都可以讄?0
__in DWORD_PTR dwContext // 一般都可以讄?0
);

(3)dh

HttpAddRequestHeaders 原型

BOOL HttpAddRequestHeaders(
   __in HINTERNET hConnect,//HttpOpenRequest q回的句?/font>
   __in LPCTSTR lpszHeaders,//包含要添加到h中的头的字符串的指针Q每个头都要以一?CR/LF ( "r"n"r"n ) 对结?/font>
   __in DWORD dwHeadersLength,//lpszHeaders指向的字W串的长度(以TCHARcd讎ͼ(j). 如果q个参数被设?1Q则字符串被当作?l尾的字W串处理Q自动计该字符串的长度
   __in DWORD dwModifiers
);
dwModifiers

可以是下面这些值的l合

Value Meaning

HTTP_ADDREQ_FLAG_ADD

Adds the header if it does not exist. Used with HTTP_ADDREQ_FLAG_REPLACE.

HTTP_ADDREQ_FLAG_ADD_IF_NEW

Adds the header only if it does not already exist; otherwise, an error is returned.

HTTP_ADDREQ_FLAG_COALESCE

Coalesces headers of the same name.

HTTP_ADDREQ_FLAG_COALESCE_WITH_COMMA

Coalesces headers of the same name. For example, adding "Accept: text/*" followed by "Accept: audio/*" with this flag results in the formation of the single header "Accept: text/*, audio/*". This causes the first header found to be coalesced. It is up to the calling application to ensure a cohesive scheme with respect to coalesced/separate headers.

HTTP_ADDREQ_FLAG_COALESCE_WITH_SEMICOLON

Coalesces headers of the same name using a semicolon.

HTTP_ADDREQ_FLAG_REPLACE

Replaces or removes a header. If the header value is empty and the header is found, it is removed. If not empty, the header value is replaced.

(4)发送一个请?/font>

HttpSendRequest

BOOL HttpSendRequest(
__in HINTERNET hRequest, //HttpOpenRequst q回的句?br /> __in LPCTSTR lpszHeaders, //附加到请求上的头Q可以ؓ(f)NULL
__in DWORD dwHeadersLength, //lpszHeaders指向的字W串的长度(以TCHARcd讎ͼ(j). 如果q个参数被设?1Q当调用的是HttpSendRequestA时则字符串被当作?l尾的字W串处理Q自动计该字符串的长度。当调用的是 HttpSendRequestW时就?x)生一个错?br /> __in LPVOID lpOptional, //当用POST或PUTҎ(gu)Ӟq个参数指向的数据会(x)紧接着h被发送出厅R没有需要发送的数据则可以设|ؓ(f)NULL
__in DWORD dwOptionalLength //lpOptional数据的字节长度,无数据时讄?
);

(5)向服务器发送数?/font>

Ҏ(gu)一Q参见上面HttpSentRequest的lpOptional参数的说?/font>

Ҏ(gu)二:(x)使用 InternetWriteFile 向一个句柄里发送数据,然后使用 HttpSendRequestEx 发?/font>

(6)查询一个请求的信息

HttpQueryInfo

BOOL HttpQueryInfo(
__in      HINTERNET hRequest, /*?HttpOpenRequest ?InternetOpenUrl q回的句?/
__in      DWORD dwInfoLevel,/*
Query Info Flags.*/
   __inout LPVOID lpvBuffer, /*用于存储查询l果的缓冲区Q不可ؓ(f)NULL*/
__inout LPDWORD lpdwBufferLength,/*lpvBuffer指向的缓冲区的字节长?br />          若函数执行成功,q个变量存储的是写到~冲区里的数据长度。如果数据是字符串则q回的长度不包括字符串的l束字符
         如果函数发生 ERROR_INSUFFICIENT_BUFFER 错误, 则这个变量里保存的是数据的实际字节长度程序需要根据这个长度重新分配内存,再执行一ơ这个函?/
__inout LPDWORD lpdwIndex /*没看大明白,不过g可以讄为NULL
        Pointer to a zero-based header index used to enumerate multiple headers with the same name.
        When calling the function, this parameter is the index of the specified header to return.
        When the function returns, this parameter is the index of the next header.
        If the next index cannot be found, ERROR_HTTP_HEADER_NOT_FOUND is returned.*/
);

(7)?/font> WWW 上下载资?/font>

在调?HttpOpenRequest ?HttpSendRequest 之后Q?E序可以使用 InternetReadFile, InternetQueryDataAvailable, InternetSetFilePointer 来下载HTTP服务器上的资源了(jin)?/font>

BOOL InternetQueryDataAvailable(//查询数据的长?br />
__in   HINTERNET hFile, //?InternetOpenUrl, FtpOpenFile, GopherOpenFile, ?HttpOpenRequest
q回的句?br /> __out LPDWORD lpdwNumberOfBytesAvailable, //用于存放数据长度的指?br /> __in DWORD dwFlags, //保留参数Q置0
__in DWORD_PTR dwContext //保留参数Q置0
);
BOOL InternetReadFile( //d句柄的数?/font>
__in    HINTERNET hFile, // InternetOpenUrl, FtpOpenFile, GopherOpenFile, HttpOpenRequest 创徏的句?/font>
__out LPVOID lpBuffer, // 存放数据的缓冲区
__in    DWORD dwNumberOfBytesToRead, // 准备d的字节数
__out LPDWORD lpdwNumberOfBytesRead // d?jin)的字节?/font>
);

DWORD InternetSetFilePointer( //讄InternetReadFile的文件位|(莫非多线E下载就是用q个实现的?Q,服务器不支持随机讉K的话函数调用?x)失败,如? InternetReadFile已经dC(jin)文g的末,q个函数的调用也?x)失败?br /> __in HINTERNET hFile, //?InternetOpenUrl (on an HTTP or HTTPS URL)创徏? 或由HttpOpenRequest 创徏(使用 GET ?HEADҎ(gu)Q而且句柄已经?HttpSendRequest 讉Kq了(jin)).
q个句柄也不可以使用 INTERNET_FLAG_DONT_CACHE ?INTERNET_FLAG_NO_CACHE_WRITE 标志
__in LONG lDistanceToMove, //Ud的字节数。正数向后移动,负数向前Ud
__in PVOID pReserved, //保留参数Qؓ(f)NULL
__in DWORD dwMoveMethod, //指定?jin)移动指针时的参考点。FILE_BEGINQ用这个标志时Q移动的字节数被当作无符h处理Q、FILE_CURRENT、FILE_ENDQ如果内容的长度无法获得Q则使用q个标志时会(x)p|Q?br /> __in DWORD_PTR dwContext //保留参数Qؓ(f)NULL
);


Eric_jiang 2010-07-21 12:57 发表评论
]]>
վ֩ģ壺 ɽ| ¹| | н| Ͳ| ɽ| Ϫ| üɽ| | żҽ| | ˮ| ˳| | żҽ| | ˱| | | | | | | | ʳ| | | | ɳ| | ˫| | | | | | ʶ| | Դ| Ӣ| |