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. 练习sql语句的好去处——http://www.sqlzoo.cn/

    sql语句的编写需要按照实际的例子来练习. 如果自己来做准备,需要你自己搭好数据库,建好库和表,还要填入数据,最后自己想出题目和正确答案. 不过,现在我发现了一个好去处,http://www.sqlz ...

  2. latex使用问题总结1

    文献引用问题 若使用了\usepackage[super, square, number, sort&compress]{natbib},\cite的文献并不与文本平行,反而位于右上角 文献引 ...

  3. 初学js

    接触时感觉跟前面写网页的差距和大,与c语言很相似.主要学的有: 1.引入js的三种方法:外联,内联,嵌套 2.标识符:第一个字符可以是任意Unicode字母,以及美元符号($)和下划线(_). - 第 ...

  4. js 控制表单提交

    <form id="form2"> <input type="text" name="text" value=" ...

  5. Erlang&RabbitMQ服务安装配置

    RabbitMQ是流行的开源消息队列系统,是AMQP(Advanced Message Queuing Protocol高级消息队列协议)的标准实现,用erlang语言开发.RabbitMQ据说具有良 ...

  6. [转]查看Flash Log输出

    1.安装Debug版本的FlashPlayer 2.mm.cfg配置文件 xp:C:\Documents and Settings\username\mm.cfg Vista/7: C:\users\ ...

  7. 【1】springmvc4 + servlet3 零配置全注解入门项目helloword

    自从servlet3.0支持注解,使得javaweb项目使用全注解成为可能. 注解化将成为javaweb的发展方向.包括spring去年推出的spring-boot也是全部使用注解. 代码:https ...

  8. AFNetworking3.0使用

    AFHTTPSessionManager: 根据这个对象可以对请求千设置一些参数和状态 //得到一个session manager AFHTTPSessionManager *manager = [A ...

  9. Unity中游戏的声音管理

    using UnityEngine;using System.Collections;using System.Collections.Generic;/// <summary>/// 用 ...

  10. 排序系列 之 简单选择排序及其改进算法 —— Java实现

    简单选择排序算法: 基本思想: 在待排序数据中,选出最小的一个数与第一个位置的数交换:然后在剩下的数中选出最小的数与第二个数交换:依次类推,直至循环到只剩下两个数进行比较为止. 实例: 0.初始状态 ...