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. 输入任意一个字符串,如:“abDEe23dJfd343dPOddfe4CdD5ccv!23rr”。取出该字符串中所有的字母。顺序不能改变!并把大写字母变成小写,小写字母变成大写!

    package lovo.Linyoujia; import java.util.Scanner; public class Java { @param args public static void ...

  2. Oracle查询表空间使用情况

    --查询表空间使用情况 SELECT UPPER(F.TABLESPACE_NAME) "表空间名", D.TOT_GROOTTE_MB "表空间大小(M)", ...

  3. CSipSimple的插件结构

    CSipSimple的第三方编码器是以插件形式集成的,那么它是怎么实现的?我们以音频编码器为例进行说明. 一.何为插件 工程中有一个包,com.csipsimple.plugins.codecs.从包 ...

  4. 百度前端技术学院2015JavaScript基础部分代码实现

    2. JavaScript数据类型及语言基础(一)    2.1 任务描述 创建一个JavaScript文件,比如util.js: 实践判断各种数据类型的方法,并在util.js中实现以下方法:  / ...

  5. JDBC driver connection string大全

    Database   / data source URL format /   driver name Value Default port MySQL URL format: jdbc:mysql: ...

  6. Android Context上下文解析

    1.Context概念 Context,相信不管是第一天开发Android,还是开发Android的各种老鸟,对于Context的使用一定不陌生~~你在加载资源.启动一个新的Activity.获取系统 ...

  7. python中if __name__ == '__main__': 的解析

    当你打开一个.py文件时,经常会在代码的最下面看到if __name__ ==  '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一 ...

  8. Git在Windows环境下配置Diff以及Merge工具---DiffMerge

    参考出处:http://coding4streetcred.com/blog/post/Configure-DiffMerge-for-Your-Git-DiffTool主要转自:http://blo ...

  9. WPF环境下多点触屏开发的一些经验(转)

    本系列将介绍Multi-Touch(MT)多点触控技术的相关内容,使开发人员了解如何在Windows 平台中开发出具有MT 功能的应用程序.众所周知Windows 7 操作系统自身已经支持具有MT 功 ...

  10. JavaWeb--Servlet部分笔记

    1.集群:数万个服务器协同工作 2.web应用核心组件:jsp和servlet(属于门户),都在web容器中执行 3.web客户端发http请求(大的字符串)给web服务器:web服务器根据头信息来定 ...