wininet是对socket的封装

主要流程为创建,连接,发送,接收,关闭几个过程

所以在回调函数InternetStatusCallback中可以检测到dwInternetStatus

#define INTERNET_STATUS_HANDLE_CREATED          60

#define INTERNET_STATUS_CONNECTING_TO_SERVER    20
#define INTERNET_STATUS_CONNECTED_TO_SERVER     21

#define INTERNET_STATUS_SENDING_REQUEST         30
#define INTERNET_STATUS_REQUEST_SENT            31

#define INTERNET_STATUS_RECEIVING_RESPONSE      40
#define INTERNET_STATUS_RESPONSE_RECEIVED       41

#define INTERNET_STATUS_REQUEST_COMPLETE        100

#define INTERNET_STATUS_CLOSING_CONNECTION      50
#define INTERNET_STATUS_CONNECTION_CLOSED       51

所以有的时候在设置超时时候不好用 因为只是设置了一个过程的超时整体超时还是不好用

如超时有

#define INTERNET_OPTION_CONNECT_TIMEOUT         2

#define INTERNET_OPTION_CONTROL_SEND_TIMEOUT    INTERNET_OPTION_SEND_TIMEOUT
#define INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT INTERNET_OPTION_RECEIVE_TIMEOUT
#define INTERNET_OPTION_DATA_SEND_TIMEOUT       7
#define INTERNET_OPTION_DATA_RECEIVE_TIMEOUT    8

应该设置各个流程的超时如:

InternetSetOption(NULL, INTERNET_OPTION_CONTROL_RECEIVE_TIMEOUT, &dwTimeout, sizeof(DWORD));

但是每个流程超时设置后应答时间和预期还是不一样。可能有几种原因,

1.各个流程不是按照最长流程超时返回,所以有的流程没有花费timeout超时已经返回

2.设置超时还不够完整 还有别的流程需要设置超时

3.设置超时失效http://support.microsoft.com/kb/176420也许是微软BUG

关于异步wininet网上都说要用InternetReadFileEx而不用InternetReadFile但是我试了一下两个函数其实一样只是参数不一样罢了
其实在使用该两个函数的时候经常会返回 重叠 I/O 操作在进行中的错误,是http缓冲区正在读数据。
 
当没调用一次InternetReadFile 就会发现回调函数发送一次INTERNET_STATUS_RECEIVING_RESPONSE  接收数据的信号
首先在InternetReadFile要取得读取的数据大小用 ret = HttpQueryInfo(hRequest, HTTP_QUERY_CONTENT_LENGTH,  szContentLength, &length,&index); HTTP_QUERY_CONTENT_LENGTH为数据大小。
主要在收到回调的两个地方来调用InternetReadFile 一是 INTERNET_STATUS_REQUEST_COMPLETE 当数据量比较小的时候只需要读一次就可以返回
所有数据 但数据量比较大的时候需要等INTERNET_STATUS_RESPONSE_RECEIVED  通知,不论数据量多大只需要这两个过程足够,而不是想象的可以有多次
INTERNET_STATUS_RESPONSE_RECEIVED 
一个完整小数据量流程为:
#define INTERNET_STATUS_HANDLE_CREATED          60
#define INTERNET_STATUS_CONNECTING_TO_SERVER    20
#define INTERNET_STATUS_CONNECTED_TO_SERVER     21
#define INTERNET_STATUS_SENDING_REQUEST         30
#define INTERNET_STATUS_REQUEST_SENT            31
#define INTERNET_STATUS_RECEIVING_RESPONSE      40
#define INTERNET_STATUS_RESPONSE_RECEIVED       41
#define INTERNET_STATUS_REQUEST_COMPLETE        100
一个完整大数据量流程为:
#define INTERNET_STATUS_HANDLE_CREATED          60
#define INTERNET_STATUS_CONNECTING_TO_SERVER    20
#define INTERNET_STATUS_CONNECTED_TO_SERVER     21
#define INTERNET_STATUS_SENDING_REQUEST         30
#define INTERNET_STATUS_REQUEST_SENT            31
#define INTERNET_STATUS_RECEIVING_RESPONSE      40
#define INTERNET_STATUS_RESPONSE_RECEIVED       41
#define INTERNET_STATUS_REQUEST_COMPLETE        100
#define INTERNET_STATUS_RECEIVING_RESPONSE      40
#define INTERNET_STATUS_RESPONSE_RECEIVED       41
但大数据量比较大的时候就会出现一个问题:
分两个InternetReadFile怎么把HTTP_QUERY_CONTENT_LENGTH分成两块呢?
我试了多种方法:
1。InternetQueryDataAvailable(hRequest,&length,0,0);
取得可用数据长度但是失败了。
2.通过回调函数中的lpvStatusInformation取得数据还是不对
 
通过调用InternetReadFile会发现虽然返回值是错误(重叠 I/O 操作在进行中的错误)但是数据buffer中时有数据的也就是说已经读了一部分
最后经过调查和尝试发现前两种情况返回的长度不是读取的数据的长度而是取得字符串的长度,为查找'\0'结束符返回的长度。最后经过尝试发现
在第一次InternetReadFile把申请的HTTP_QUERY_CONTENT_LENGTH数据全部传入
在第二次InternetReadFile传入buffer+strlen(buffer1)惊奇的发现好用了。。。。
 

wininet异步InternetReadFile和超时相关问题的更多相关文章

  1. 使用C# HttpWebRequest进行多线程网页提交。Async httpclient/HttpWebRequest实现批量任务的发布及异步提交和超时取消

    使用线程池并发处理request请求及错误重试,使用委托处理UI界面输出. http://www.cnblogs.com/Charltsing/p/httpwebrequest.html for (i ...

  2. curl常用设置-涉及超时相关

    curl_easy_setopt( curl, CURLOPT_VERBOSE, 1L ); //在屏幕打印请求连接过程和返回http数据 curl_easy_setopt( curl, CURLOP ...

  3. 怎样给ExecutorService异步计算设置超时

    ExecutorService接口使用submit方法会返回一个Future<V>对象.Future表示异步计算的结果.它提供了检查计算是否完毕的方法,以等待计算的完毕,并获取计算的结果. ...

  4. 记一次.net core 异步线程设置超时时间

    前言: 刷帖子看到一篇 Go 记录一次groutine通信与context控制 看了一下需求背景,挺有意思的,琢磨了下.net core下的实现 需求背景: 项目中需要定期执行任务A来做一些辅助的工作 ...

  5. MySQL--数据超时相关参数

    =============================================== connect_timeout connect_timeout用在client和server之间建立连接 ...

  6. koa 中,中间件异步与同步的相关问题

    同步中间件很容易理解,如以下代码: const Router = require('koa-router') , koa = new Router({ prefix: '/koa' }) , fs = ...

  7. DAOS 分布式异步对象存储|相关组件

    DAOS 的安装涉及多个组件,这些组件可以是集中式的,也可以是分布式的. DAOS 软件定义存储 (software-defined storage, SDS) 框架依赖于两种不同的通信通道: 用于带 ...

  8. (原)Android理论梳理-No1异步处理之Handler相关机制

    1 Handler的基本概念: 什么是handler? Handler是安卓系统的一种回调机制. handler的作用? 他的作用是用于不同线程之间的通讯.一是可以用于子线程与UI线程的数据通信,因为 ...

  9. 记录 FTPClient 超时处理的相关问题

    apache 有个开源库:commons-net,这个开源库中包括了各种基础的网络工具类,我使用了这个开源库中的 FTP 工具. 但碰到一些问题,并不是说是开源库的 bug,可能锅得算在产品头上吧,各 ...

随机推荐

  1. LDAP抛出Error Code 3 - Timelimit Exceeded 异常,导致CAS连接报错

    最近公司使用CAS连接LDAP,实现单点登录.遇到了这个问题:登录后,抛出错误: 查看CAS后台,看到这个异常. javax.naming.TimeLimitExceededException: LD ...

  2. codeforces problem 140E New Year Garland

    排列组合题 题意 用m种颜色的彩球装点n层的圣诞树.圣诞树的第i层恰由l[i]个彩球串成一行,且同一层内的相邻彩球颜色不同,同时相邻两层所使用彩球的颜色集合不同.求有多少种装点方案,答案对p取模. 只 ...

  3. ssh 无密码登陆

    ssh -i littlesuccess-aws.pem root@172.31.36.91 "cat >> ~/.ssh/authorized_keys" < ...

  4. SharpDevelop学习笔记(5)—— AddIns系统详解

    在所有的插件被加载到指定的扩展点后,插件树就被创建完毕了, 但是,我们知道,插件树创建后,每个插件在插件树的位置在就固定的,但是,如果某些情况下,我们希望一些插件不可使用或应该隐藏起来, 或者说有的插 ...

  5. Buffer、Channel示例

      a.txt 孔雀向西飞,今朝更好看.孔雀向西飞,今朝更好看.孔雀向西飞,今朝更好看.孔雀向西飞,今朝更好看. 示例一. package com.test; import java.io.FileI ...

  6. 在iis7上如何配置来看到asp报错

    今天网站改版时碰到一个问题,客户要求老网站的地图等功能要保持,但是老网站是用asp开发的.我们可以直接利用老的数据库以及老的代码,但是部署到新的服务器上一直报错. 刚开始是404,后来是500...今 ...

  7. C++线程池

    之前一直在找一个开源的C++线程池库,找了很久也没有找到一个好用的,后来项目需要, 本想自己写一个,但是无意中在github上面找了一个采用boost库实现的threadpool,后来研究 了一下源码 ...

  8. 区分PC端与移动端代码,涵盖C#、JS、JQuery、webconfig

    1)C#区分PC端或移动端 using System.Text.RegularExpressions string u = Request.ServerVariables["HTTP_USE ...

  9. redis随笔集-使用

    redis是一个开源的.使用C语言编写的.支持网络交互的.可基于内存也可持久化的Key-Value数据库 一数据集合: 1.list -- 链表  key-value形式,通过list ID  可以实 ...

  10. NAT123内网映射端口

    在无内网路由管理员权限的情况下,需要将内网web应用暴露到公网访问,此时需要用到花生壳或者nat123(两个应用都不是免费的,其中花生壳可以8元认证,以后免费使用,nat123按天收费) 花生壳 ht ...