精华内容
下载资源
问答
  • WinInet

    2019-04-02 17:07:18
    About WinInet:https://docs.microsoft.com/en-us/windows/desktop/WinInet/about-wininet https://blog.csdn.net/zhenyusoso/article/details/7956672 WinInet, WinHttp, Winsock, ws2_32的区别和联系 在Windows...

    About  WinInet:  https://docs.microsoft.com/en-us/windows/desktop/WinInet/about-wininet 

    https://blog.csdn.net/zhenyusoso/article/details/7956672

    WinInet, WinHttp, Winsock, ws2_32的区别和联系

    在Windows平台进行网络程序开发, 可以使用不同的库, 但是最常用的还是微软自己开发的库。具体说来,有:

    (1)Winsock,工作于网络层和传输层的开发库,对于编写TCP,UDP,以及原始IP通信程序非常合适。函数原形也基本符合Unix socket标准。Windows平台上的大多数程序,如QQ,讯雷等都基于其开发。

    (2)ws2_32,是Winsock的升级版本,在兼容的基础上增加了不符合Unix socket标准,但更适合Windows平台的库函数,一般以WSA*开头。

    现代的大多数Windows平台程序也都开始依赖于此库。

    (3)WinInet,Windows Internet扩展库,工作于应用协议层,提供了http,ftp,gopher协议的实现,为基于以上三种协议的程序开发提供基础平台,需要说明的是,尽管WinInet工作于应用层,但其本身wininet.dll的实现并不依赖于winsock.dll或ws2_32.dll,而是独立存在的。至少目前的版本是这样。基于WinInet的应用程序最著名的例子就是IE了。

    (4)WinHttp,也是工作于应用协议层,提供了http协议的实现。看起来与WinInet有重复的部分,没错,WinHttp就是为了替换WinInet中的http部分的,它更加健壮稳定,而且还为http服务器端开发提供了库函数。如果进行现代http的开发,建议使用WinHTTP而不是WinInet。使用WinHTTP进行开发的著名例子就是Google的浏览器Chrome,但是Chrome2.0以后版本google放弃了winhttp而是使用了自己开发的http库,这也是为了使chrome实现跨平台的重要举措。另外,WinHttp.dll也不依赖于winsock或ws2_32,也是独立运行的。

    如果基于socket编程的话,Winows平台与其它平台函数基本相同,实现跨平台比较容易。

    如果基于http进行编程的话,不同平台库差别很大,如果不考虑跨平台使用WinHttp,如果考虑跨平台可以考虑使用libwww。

    另外,wsock和wininet或winhttp也可以同时使用。

     

    WinInet HttpSendRequest使用的事项

    1. HttpSendRequest不支持异步模式,虽然API文档说可以,但是在其它官方文章中已证实不可以;要用异步方式完成任务,需要通过使用线程来自己封装。
    2. HttpSendRequest使用的INTERNETHANLE要每次通过HttpOpenRequest获取,不能重用,否则可能会出现无法读取返回数据或数据重复等错误;虽然API文档说只要每次把上次的数据取完就可以,但这是经历了无数痛苦的unit test后换来的经验。
    3. 发送httpSendRequest后,需要使用InternetReadFile来读取,重复多次读,直到返回数据为0byte为止。
    4. 错误代码在 http://support.microsoft.com/kb/193625  ,API文档中找不到。

     

     

    什么是WinHTTP?

    WinHTTP的全称是Microsoft Windows HTTP Services, 它提供给开发者一个HTTP客户端应用程序接口(API), 通过这种API借助HTTP协议给其他的HTTP服务器发送请求.

    WinHTTP支持桌面应用程序, Windows系统服务, 和Windows服务器端应用程序.

    对于基于Microsoft .NET Framework的应用程序, 不推荐使用WinHTTP服务, 因为.NET Framework应用程序应该使用在System.Net命名空间下的网络基础设施类型.

    WinHTTP提供了两种编程方式, 一种是CC++的API, 另一种是COM组件.

    WinHTTP与WinINet的区别

    ================

    WinHTTP被设计为主要应用在服务器端应用程序的场景下, 让服务器端应用程序访问HTTP服务器.

    WinINet是一种更老的技术, 它被设计为一个HTTP客户端平台, 用于交互式桌面应用程序, 比如说IE, Office等.

    服务器端应用程序要求HTTP客户端服务使用WinHTTP而不是WinINet.

    WinHTTP和WinINet在微软是由不同的团队来提供支持的.

    WinHTTP与Proxy

    ================

    如果HTTP Proxy需要认证(authentication), 那么HTTP Application会收到407(proxy requires authentication). 除了这个状态码, 代理服务器还会发送一个或更多的authenticate headers: “Proxy-Authenticate”. 这些信息足够我们在network monitor trace中鉴定HTTP无法访问是否是由于proxy需要认证引起的了.

    WinHTTP的proxy配置是存储在注册表键

    HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindowsCurrentVersionInternet SettingsConnectionsWinHttpSettings

    当中的, 修改和查看需要使用一个命令行工具proxycfg.

     

    在嵌入式系统,选WinInet 来开发。  目前是这样选的, 有进展再来更新......

    展开全文
  • WinINet

    2016-09-07 21:30:16
    Windows Internet ----WinINet Reference ------WinINet  https://msdn.microsoft.com/en-us/library/windows/desktop/aa384350(v=vs.85).aspx

    Windows Internet ----WinINet Reference ------WinINet 

    https://msdn.microsoft.com/en-us/library/windows/desktop/aa384350(v=vs.85).aspx

    展开全文
  • wininet

    千次阅读 2010-12-31 00:03:00
    2.HINTERNET 句柄WinINet函数创建、使用的句柄都是HINTERNET类型的,这种类型的句柄无法被转换成其 它类型的句柄。换句话说,最好别用ReadFile、CloseHandle之类的函数来操作这些句柄。同样的,也别用WinINet函数来...

    1.关于WinINet

    WinINet不是给服务端用的,服务端用Microsoft Windows HTTP Services (WinHTTP)
    WinINet抽象了Gopher,FTP,HTTP协议的一些细节。
    2.HINTERNET 句柄

    WinINet函数创建、使用的句柄都是HINTERNET类型的,这种类型的句柄无法被转换成其 它类型的句柄。换句话说,最好别用ReadFile、CloseHandle之类的函数来操作这些句柄。同样的,也别用WinINet函数来访问、操作其 他类型的句柄。比如,用InternetReadFile访问CreateFile创建句柄是无法得到你想要的结果的。想关闭HINTERNET句柄要使 用InternetCloseHandle函数。

    3.句柄架构



    InternetOpen 创建的句柄在顶层,由接下来的一层的 InternetOpenUrl 和 InternetConnect 使用,而 InternetConnect 创建的句柄又被之后的几个函数使用。

    下面这张图是依赖 InternetOpenUrl 创建的句柄的几个函数,灰色的方框是返回 HINTERNET 句柄的函数,而白色的框就是使用被创建的 HINTERNET 句柄的函数


    FTP Hierarchy





    HTTP Hierarchy





    注意这张图,这张图的意思是 HttpSendRequestEx 先访问 HttpOpenRequest 创建的句柄之后, HttpEndRequestInternetReadFileEx 和InternetWriteFile 才能访问这个句柄。 HttpEndRequest 被调用之后,才轮的到InternetReadFileInternetSetFilePointer 和InternetQueryDataAvailable 来访问这个句柄。

    4.内容编码

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

    设置解码选项之后, WinInet 在你调用 InternetReadFile 是就会执行一次解码。不过就算你打开了解码选项,它也不一定就为你解码……当这种情况发生时,InternetReadFile 函数会失败并返回ERROR_INTERNET_DECODING_FAILED.这个时候你可以选择去掉Accept-Encoding头重新发送一次请求,或者把解码关掉然后自己来解码(这时你就得检查Content-Encoding头来判断编码方式了)。

    5.协议无关函数

    Function Description
    InternetFindNextFile 继续文件的枚举或搜索. 需要以下函数创建的句柄 FtpFindFirstFileGopherFindFirstFileInternetOpenUrl
    InternetLockRequestFile 允许用户锁定文件. 需要以下函数创建的句柄 FtpOpenFileGopherOpenFileHttpOpenRequestInternetOpenUrl .
    InternetQueryDataAvailable 查询可用数据的数量. 需要以下函数创建的句柄 FtpOpenFileGopherOpenFileHttpOpenRequest .
    InternetQueryOption 查询 Internet 设置.
    InternetReadFile 读取 URL 数据. 需要以下函数创建的句柄 InternetOpenUrlFtpOpenFileGopherOpenFileHttpOpenRequest .
    InternetSetFilePointer 设置文件指针. 需要以下函数创建的句柄 InternetOpenUrl ( HTTP URL only) HttpOpenRequest (GET 方法).
    InternetSetOption 配置 Internet 设置.
    InternetSetStatusCallback 设置一个接收状态信息的回调函数. 分配一个回调函数给指定的 HINTERNET 句柄及从其演化而来的句柄.
    InternetUnlockRequestFile 解锁被 InternetLockRequestFile 锁定的文件.

    读文件

    函数 InternetReadFile 用来从一个由函数 InternetOpenUrlFtpOpenFileGopherOpenFileHttpOpenRequest 返回的 HINTERNET 句柄下载资源.

    WinINet 提供了两种方法来下载整个资源

    InternetQueryDataAvailable 使用 InternetOpenUrlFtpOpenFileGopherOpenFileHttpOpenRequest (还记得上面的那个图么,这个函数需要在HttpSendRequest 操作该句柄之后才能访问这个句柄) 创建的句柄。返回有效数据的字节数,据此,我们就可以分配足够的内存并进行读取,但是这种方法不保险,包头里的长度可能是过时的,而且包头也可能会丢。

    当所有数据都被读完的时候, InternetReadFile 会返回0字节被读取(lpdwNumberOfBytesRead 参数保存了读取的字节数). 据此,我们就可以循环调用InternetReadFile 直到读取结束。

    寻找文件

    先使用 FtpFindFirstFileGopherFindFirstFile, 或 InternetOpenUrl ,然后将其返回的句柄作为参数 传递给 InternetFindNextFile 进行继续查找,持续调用 InternetFindNextFile 知道返回扩展的错误信息 ERROR_NO_MORE_FILES 来完成整个搜索,调用 GetLastError 来获取最后的错误信息.

    6.HTTP 会话


    使用 WinINet 函数访问WWW资源

    (1)初始化 WWW 连接

    将服务类型设为 INTERNET_SERVICE_HTTP 调用 InternetConnect 来建立一个 HTTP 会话

    HINTERNET InternetConnect(
    __in HINTERNET hInternet, //InternetOpen 返回的句柄
    __in LPCTSTR lpszServerName, //可以描述目标服务器的字符串
    __in INTERNET_PORT nServerPort,//目标服务器的端口
    __in LPCTSTR lpszUsername,//用户名
    __in LPCTSTR lpszPassword,//密码
    __in DWORD dwService,//使用的服务类型
    __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)建立请求

    调用 HttpOpenRequest 来建立一个 HTTP 请求,不过这个函数不会自动把请求发送出去,要发送请求需要调用 HttpSendRequest

    HttpOpenRequest 原型


    HINTERNET HttpOpenRequest(
    __in HINTERNET hConnect// InternetConnect 函数返回的句柄
    __in LPCTSTR lpszVerb// 动作,有GET, PUT, POST。也可以设置为 NULL ,会被当成默认的 GET 来用
    __in LPCTSTR lpszObjectName// 一个描述你请求资源的字符串,当请求一个默认页面时令这个参数指向一个空串
    __in LPCTSTR lpszVersion// HTTP 版本,这个参数为 NULL 时,默认使用""HTTP/1.1""
    __in LPCTSTR lpszReferer// 说明了lpszObjectName是取自哪个文件,可以设为NULL
    __in LPCTSTR *lplpszAcceptTypes//
     是一个指向LPCTSTR数组的指针!数组以一个NULL指针结束。指定了程序接受的内容的类型,设为空则不接受 任何类型的内容,设为空串则等价于""text/*"",即不接受文本文件以外的图片等文件,只接受某种特定的文件可以用类似"image/gif, image/jpeg"的方式。关于更多内容类型 请看这里
    __in DWORD dwFlags// 一般都可以设置为 0
    __in DWORD_PTR dwContext // 一般都可以设置为 0
    );

    (3)添加请求

    HttpAddRequestHeaders 原型

    BOOL HttpAddRequestHeaders(
       __in HINTERNET hConnect,//HttpOpenRequest 返回的句柄
       __in LPCTSTR lpszHeaders,//包含要添加到请求中的头的字符串的指针,每个头都要以一个 CR/LF ( "r"n"r"n ) 对结束
       __in DWORD dwHeadersLength,//lpszHeaders指向的字符串的长度(以TCHAR类型记). 如果这个参数被设为-1,则字符串被当作以0结尾的字符串处理,自动计算该字符串的长度
       __in DWORD dwModifiers
    );
    dwModifiers

    可以是下面这些值的组合

    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)发送一个请求

    HttpSendRequest

    BOOL HttpSendRequest(
    __in HINTERNET hRequest, //HttpOpenRequst 返回的句柄
    __in LPCTSTR lpszHeaders, //附加到请求上的头,可以为NULL
    __in DWORD dwHeadersLength, //lpszHeaders指向的字符串的长度(以TCHAR类型记). 如果这个参数被设为-1,当调用的是HttpSendRequestA时则字符串被当作以0结尾的字符串处理,自动计算该字符串的长度。当调用的是 HttpSendRequestW时就会产生一个错误
    __in LPVOID lpOptional, //当使用POST或PUT方法时,这个参数指向的数据会紧接着请求被发送出去。没有需要发送的数据则可以设置为NULL
    __in DWORD dwOptionalLength //lpOptional数据的字节长度,无数据时设置为0
    );

    (5)向服务器发送数据

    方法一:参见上面HttpSentRequest的lpOptional参数的说明

    方法二:使用 InternetWriteFile 向一个句柄里发送数据,然后使用 HttpSendRequestEx 发送

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

    HttpQueryInfo

    BOOL HttpQueryInfo(
    __in      HINTERNET hRequest, /*由 HttpOpenRequest 或 InternetOpenUrl 返回的句柄*/
    __in      DWORD dwInfoLevel,/*
     Query Info Flags.*/
       __inout LPVOID lpvBuffer, /*用于存储查询结果的缓冲区,不可为NULL*/
    __inout LPDWORD lpdwBufferLength,/*lpvBuffer指向的缓冲区的字节长度
             若函数执行成功,这个变量存储的是写到缓冲区里的数据长度。如果数据是字符串则返回的长度不包括字符串的结束字符
             如果函数发生 ERROR_INSUFFICIENT_BUFFER 错误, 则这个变量里保存的是数据的实际字节长度程序需要根据这个长度重新分配内存,再执行一次这个函数*/
    __inout LPDWORD lpdwIndex /*没看大明白,不过似乎可以设置为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) WWW 上下载资源

    在调用 HttpOpenRequest 和 HttpSendRequest 之后, 程序可以使用 InternetReadFileInternetQueryDataAvailable,InternetSetFilePointer 来下载HTTP服务器上的资源了。

    BOOL InternetQueryDataAvailable(//查询数据的长度
    __in HINTERNET hFile, //由 InternetOpenUrl, FtpOpenFile, GopherOpenFile, 或 HttpOpenRequest
    返回的句柄
    __out LPDWORD lpdwNumberOfBytesAvailable, //用于存放数据长度的指针
    __in DWORD dwFlags, //保留参数,置0
    __in DWORD_PTR dwContext //保留参数,置0
    );
    BOOL InternetReadFile( //读取句柄的数据
    __in    HINTERNET hFile, // InternetOpenUrl, FtpOpenFile, GopherOpenFile, HttpOpenRequest 创建的句柄
    __out LPVOID lpBuffer, // 存放数据的缓冲区
    __in    DWORD dwNumberOfBytesToRead, // 准备读取的字节数
    __out LPDWORD lpdwNumberOfBytesRead // 读取了的字节数
    );

    DWORD InternetSetFilePointer( //设置InternetReadFile的文件位置(莫非多线程下载就是用这个实现的?),服务器不支持随机访问的话函数调用会失败,如果 InternetReadFile已经读取到了文件的末尾,这个函数的调用也会失败。
    __in HINTERNET hFile, //由 InternetOpenUrl (on an HTTP or HTTPS URL)创建。 或由HttpOpenRequest 创建(使用 GET 或 HEAD方法,而且句柄已经被 HttpSendRequest 访问过了). 
    这个句柄也不可以使用 INTERNET_FLAG_DONT_CACHE 或 INTERNET_FLAG_NO_CACHE_WRITE 标志
    __in LONG lDistanceToMove, //移动的字节数。正数向后移动,负数向前移动
    __in PVOID pReserved, //保留参数,为NULL
    __in DWORD dwMoveMethod, //指定了移动指针时的参考点。FILE_BEGIN(使用这个标志时,移动的字节数被当作无符号数处理)、FILE_CURRENT、FILE_END(如果内容的长度无法获得,则使用这个标志时会失败)
    __in DWORD_PTR dwContext //保留参数,为NULL
    );
    展开全文
  • WinInet模块.rar

    2020-04-05 18:48:05
    WinInet模块.rar WinInet模块.rar WinInet模块.rar WinInet模块.rar WinInet模块.rar WinInet模块.rar
  • autoit wininet

    2012-05-25 14:47:03
    autoit wininet.au3 api wininet.dll
  • Wininet详解

    2011-09-18 17:21:11
    Wininet详解,介绍wininet,用以开发设计。介绍了所有wininet相关的知识。
  • Interopen wininet

    2012-07-24 11:33:23
    wininet 函数关系 Interopen
  • 易语言WinInet模块源码

    2020-07-18 04:08:22
    易语言WinInet模块源码,WinInet模块,读取数据,提交数据,InternetOpen,InternetConnect,InternetReadFile,HttpOpenRequest,HttpSendRequest,HttpAddRequestHeaders,InternetCloseHandle,InternetOpenUrl
  • WinInet编程

    2017-09-01 12:53:18
    客户端从HTTP服务器下载相应的MP3文件... #include Windows.h> #include wininet.h> #pragma comment(lib, "wininet.lib") #define URL_STRING_TEST "http://eng.edu-edu.com.cn/audio/Onelove.mp3" void
    客户端从HTTP服务器下载相应的MP3文件的核心代码(HTTP中的GET方法):

    #include <Windows.h>
    #include <wininet.h>
    #pragma comment(lib, "wininet.lib")
    #define URL_STRING_TEST "http://eng.edu-edu.com.cn/audio/Onelove.mp3"
    void main()
    {
        URL_COMPONENTS crackedURL;
        TCHAR szBuffer[1024];//这里是下载缓冲区大小 1KB大小缓冲写入一次
        TCHAR szHostName[128];
        TCHAR szUrlPath[256];
        ZeroMemory(&crackedURL, sizeof (URL_COMPONENTS));
        crackedURL.dwStructSize = sizeof (URL_COMPONENTS);
        crackedURL.lpszHostName = szHostName;
        crackedURL.dwHostNameLength = sizeof(szHostName);
        crackedURL.lpszUrlPath = szUrlPath;
        crackedURL.dwUrlPathLength = sizeof(szUrlPath);
        InternetCrackUrl(URL_STRING_TEST,(DWORD)strlen(URL_STRING_TEST),0,&crackedURL);
        FILE* file = fopen("Onelove.mp3", "wb");
        HINTERNET hInt,hConn,hReq;
        //启用HTTP协议
        hInt = InternetOpen("Microsoft Internet Explorer", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
        //建立HTTP连接
        hConn =InternetConnect(hInt,crackedURL.lpszHostName,crackedURL.nPort,NULL,NULL,INTERNET_SERVICE_HTTP,0,0);
        //创建一个URL请求
        hReq = HttpOpenRequest(hConn, "GET", crackedURL.lpszUrlPath, NULL, "", NULL, 0, 0);
        char buff[64];
        DWORD dwContLen = 0;
        DWORD dwLen;
        BOOL bResult = FALSE;
        DWORD nBytesGet = 0;
        BOOL bEnd = FALSE;
        DWORD dwRetCode = 0;
        DWORD dwSizeOfRq = sizeof(DWORD);
        dwSizeOfRq = sizeof(buff);
        if (HttpSendRequest(hReq,NULL,0,NULL,0)
            && HttpQueryInfo(hReq, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwRetCode,&dwSizeOfRq, NULL)
            && dwRetCode < 400)
        {
            bResult = TRUE;//true;
        }
        //查询文件大小
        if (HttpQueryInfo(hReq, HTTP_QUERY_CONTENT_LENGTH, &buff, &dwSizeOfRq, NULL))
            dwContLen = atol(buff);
        INTERNET_BUFFERS BufferIn;
        BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur

        BufferIn.Next = NULL;
        BufferIn.lpcszHeader = strHeader.c_str(); // 请求头

        BufferIn.dwHeadersLength = strHeader.length();
        BufferIn.dwHeadersTotal = 0;
        BufferIn.lpvBuffer = NULL;
        BufferIn.dwBufferLength = 0;
        BufferIn.dwBufferTotal = 1024; // This is the only member used other than dwStructSize

        BufferIn.dwOffsetLow = 0;
        BufferIn.dwOffsetHigh = 0;
        */
          hReq = HttpOpenRequest(hConn, "GET", crackedURL.lpszUrlPath, NULL, "", NULL, 0, 0);
        if (HttpSendRequest(hReq,NULL,0,NULL,0)
            && HttpQueryInfo(hReq, HTTP_QUERY_STATUS_CODE|HTTP_QUERY_FLAG_NUMBER, &dwRetCode,&dwSizeOfRq, NULL)
            && dwRetCode < 400)
        {
            bResult = TRUE;//true;
        }
        bool bTrue = HttpSendRequestExA(hReq,&BufferIn,NULL,NULL,0);
        while(TRUE)
        {
            if (bResult)
            {
                //开始读取文件
                bResult = InternetReadFile(hReq, szBuffer, sizeof(szBuffer), &dwLen);
                if (bResult)
                {
                    cout<<"reading ... "<<(nBytesGet*100/dwContLen)<<endl;
                    nBytesGet += dwLen;
                    if (dwLen == 0)
                    {
                        bEnd = TRUE;
                        break;
                    }
                    fwrite(szBuffer, 1, dwLen, file);
                }
            }
            else //数据接受完毕
            {
                break;
            }
        }
        fclose(file);
    }

    ===================================================
    POST方法上传数据(大量)

    #include <Windows.h>
    #include <WinINet.h>
    #include <stdio.h>
    BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize);
    #define BUFFSIZE 500
    void main( int argc, char **argv )
    {
        DWORD dwPostSize;
        if (argc < 4)
        {
            printf("Usage: Bigpost <Size> <Server> <Path>\n");
            printf("<Size> is the number of KB to POST\n");
            printf("<Server> is the server to POST to\n");
            printf("<Path> is the virtual path to POST to\n");
            exit(0);
        }
        if ( ((dwPostSize = strtoul(argv[1],NULL,10)) == 0) || (dwPostSize >=) )
        {
            printf("%s is invalid size. Valid sizes are from 1 to 2047999\n",[1]);
            exit(0);
        }
        printf( "Test of POSTing %luKB with WinInet\n", dwPostSize);
        dwPostSize *= 1024; // Convert KB to bytes
        HINTERNET hSession = InternetOpen( "HttpSendRequestEx",,
            NULL, NULL, 0);
        if(!hSession)
        {
            printf("Failed to open session\n");
            exit(0);
        }


        HINTERNET hConnect = InternetConnect(hSession, argv[2],,
            NULL, NULL, INTERNET_SERVICE_HTTP,NULL, NULL);
        if (!hConnect)
            printf( "Failed to connect\n" );
        else
        {
            HINTERNET hRequest = HttpOpenRequest(hConnect, "POST", argv[3],
                NULL, NULL, NULL, INTERNET_FLAG_NO_CACHE_WRITE, 0);
            if (!hRequest)
                printf( "Failed to open request handle\n" );
            else
            {
                if(UseHttpSendReqEx(hRequest, dwPostSize))
                {    
                    char pcBuffer[BUFFSIZE];
                    DWORD dwBytesRead;

                    printf("\nThe following was returned by the server:\n");
                    do
                    {    dwBytesRead=0;
                        if(InternetReadFile(hRequest, pcBuffer, BUFFSIZE-1,&dwBytesRead))
                        {
                            pcBuffer[dwBytesRead]=0x00; // Null-terminate buffer

                            printf("%s", pcBuffer);
                        }
                        else
                            printf("\nInternetReadFile failed");
                    }while(dwBytesRead>0);
                    printf("\n");
                }
                if (!InternetCloseHandle(hRequest))
                    printf( "Failed to close Request handle\n" );
            }
            if(!InternetCloseHandle(hConnect))
                printf("Failed to close Connect handle\n");
        }
        if( InternetCloseHandle( hSession ) == FALSE )
            printf( "Failed to close Session handle\n" );

        printf( "\nFinished.\n" );
    }



    BOOL UseHttpSendReqEx(HINTERNET hRequest, DWORD dwPostSize)
    {
        INTERNET_BUFFERS BufferIn;
        DWORD dwBytesWritten;
        int n;
        BYTE pBuffer[1024];
        BOOL bRet;

        BufferIn.dwStructSize = sizeof( INTERNET_BUFFERS ); // Must be set or error will occur

        BufferIn.Next = NULL;
        BufferIn.lpcszHeader = NULL;
        BufferIn.dwHeadersLength = 0;
        BufferIn.dwHeadersTotal = 0;
        BufferIn.lpvBuffer = NULL;
        BufferIn.dwBufferLength = 0;
        BufferIn.dwBufferTotal = dwPostSize; // This is the only member used other than dwStructSize

        BufferIn.dwOffsetLow = 0;
        BufferIn.dwOffsetHigh = 0;

        if(!HttpSendRequestEx( hRequest, &BufferIn, NULL, 0, 0))
        {
            printf( "Error on HttpSendRequestEx %d\n",GetLastError() );
            return FALSE;
        }

        FillMemory(pBuffer, 1024, 'D'); // Fill buffer with data


        bRet=TRUE;
        for(n=1; n<=(int)dwPostSize/1024 && bRet; n++)
        {
            if(bRet=InternetWriteFile( hRequest, pBuffer, 1024, &dwBytesWritten))
                printf( "\r%d bytes sent.", n*1024);
        }
            
        if(!bRet)
        {
            printf( "\nError on InternetWriteFile %lu\n",GetLastError() );
            return FALSE;
        }

        if(!HttpEndRequest(hRequest, NULL, 0, 0))
        {
            printf( "Error on HttpEndRequest %lu \n", GetLastError());
            return FALSE;
        }

        return TRUE;
    }
    ====================================================
    展开全文
  • WinInet随笔

    千次阅读 2016-10-10 17:54:15
    使用Wininet最知名的程序就是IE,而很多第三方应用也使用它来方位互联网。最近做了些工作,特记录下一些随笔。 Wininet利用HINTERNET句柄保存协议相关信息,并且HINTERNET句柄以树状的形式保存,其中
  • WinInet编程例子

    2010-10-22 08:19:13
    WinInet编程例子WinInet编程例子WinInet编程例子WinInet编程例子WinInet编程例子WinInet编程例子WinInet编程例子WinInet编程例子WinInet编程例子WinInet编程例子WinInet编程例子WinInet编程例子
  • WinInet使用详解

    万次阅读 多人点赞 2017-05-19 10:35:16
    WinInet是windows平台对socket进行一层封装,用来直接处理http/ftp/Gopher协议的一套windows API。...而时隔没多久又忘记的差不多了,这个流程就...而网络上流传的WinInet代码实例,不是编译不通过,就是粗制滥造。因此现
  • wininet.dll文件下载,解决找不到wininet.dll的问题wininet.dll控件常规安装方法(仅供参考):一、如果在运行某软件或编译程序时提示缺少、找不到wininet.dll等类似提示,您可将从脚本之家下载来的wininet.dll拷贝到...
  • VC(wininet类) 用wininet实现https访问 以前项目中实现了wininet类对http的get和post访问,同样方法访问https的服务时出错, SendRequest函数异常,返回错误:与服务器的连接被重置 解决办法: OpenRequest的dwFlags...
  • 解决缺少wininet

    2015-02-20 21:19:34
    支持缺少wininet用户,帮更多人解决问题,希望对大家有帮助,谢谢
  • WinInet http post

    2014-02-12 17:30:20
    VC编程实现使用WinInet通过HTTP协议读取网上文件
  • wininet.rar

    2014-05-02 12:53:11
    wininet.rar基于桌面无法显示,丢失文件后修复的问题
  • Wininet 下载

    2010-01-15 14:23:48
    这个是一个用Wininet实现下载功能的代码(绝对源代码).希望对大家有好的帮助!(vs2005测试通过的),大家可以放心使用!
  • winInet 编程

    2008-10-30 18:30:05
    讲述了winInet 编程过程中用到的函数...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,617
精华内容 1,046
关键字:

wininet