我用CSocket编写了一个HTTP下载程序,接收数据大概如下:

//......
//use CSocket class
//send request...
//......
int recevieSize();
while(recevieSize > )
{
ZeroMemory(buff, BUFFSIZE + );
receviedSize = socket.Receive(buff, BUFFSIZE);
    if(receivedSize > 0)
{
//use CFile class
downloadFile.Write(buff, receviedSize);
//some handle...
}
 } //some handle...

  这段代码看上去毫无问题,但是运行过程中,在下载文件时,途中经常会出现ERROR_INVALID_USER_BUFFER错误,根据MSDN上的解释:“The supplied user buffer is not valid for the requested operation.”

  于是我尝试加大了缓冲区,但是问题依旧。这让我百思不得其解,上CSDN发帖问,也没人回答。于是我用CInternetSession、CHttpFile重写了这部分。这时候运行起来就毫无问题了,这让我更觉得奇怪了。

  后来根据这个stackoverflow上的这个帖子(http://stackoverflow.com/questions/12643441/win-32-writefile-access-viloation-and-error-1784),再仔细调试一下这两种代码,发现区别就在于两种代码每次写入文件的byets,因为CHttpFile::Read()每次返回固定的bytes,而CSocket::Receive()每次接收的bytes是不确定的,所以使用CSocket::Receive()接收数据每次写入文件的bytes也就不一样,根据帖子上的描述,问题应该就在这里了。

于是把代码改为这样:

//......
//use CSocket class
//send request...
//......
int recevieSize();
int readSize;
while(recevieSize > )
{
ZeroMemory(buff, BUFFSIZE + );
//downloadSize是此次任务需要下载的总bytes大小
readSize = downloadSize> BUFFSIZE ? BUFFSIZE : downloadSize;
receviedSize = socket.Receive(buff, readSize);
readSize -= receviedSize;
while(readSize && (receviedSize > ))
{
int rs = socket.Receive(buff + receivedSize, readSize);
if(rs == )//connection has been close
break;
else if(rs == SOCKET_ERROR)
{
receviedSize = rs;
break;
}
receivedSize += rs;
readSize -= rs;
}
if(receivedSize > )
{
//use CFile class
downloadFile.Write(buff, receviedSize);
//some handle...
}
}
//some handle...

  这样就保证了每次写入文件的bytes数,这样运行起来就不会出现ERROR_INVALID_USER_BUFFER了。但是为什么每次写入相同的bytes数就没问题呢?目前我也还没完全搞懂。

readSize

解决ERROR_INVALID_USER_BUFFER的更多相关文章

  1. IE6、7下html标签间存在空白符,导致渲染后占用多余空白位置的原因及解决方法

    直接上图:原因:该div包含的内容是靠后台进行print操作,输出的.如果没有输出任何内容,浏览器会默认给该空白区域添加空白符.在IE6.7下,浏览器解析渲染时,会认为空白符也是占位置的,默认其具有字 ...

  2. 关于解决python线上问题的几种有效技术

    工作后好久没上博客园了,虽然不是很忙,但也没学生时代闲了.今天上博客园,发现好多的文章都是年终总结,想想是不是自己也应该总结下,不过现在还没想好,等想好了再写吧.今天写写自己在工作后用到的技术干货,争 ...

  3. DBImport V3.7版本发布及软件稳定性(自动退出问题)解决过程分享

    DBImport V3.7介绍: 1:先上图,再介绍亮点功能: 主要的升级功能为: 1:增加(Truncate Table)清表再插入功能: 清掉再插,可以保证两个库的数据一致,自己很喜欢这个功能. ...

  4. MVVM框架从WPF移植到UWP遇到的问题和解决方法

    MVVM框架从WPF移植到UWP遇到的问题和解决方法 0x00 起因 这几天开始学习UWP了,之前有WPF经验,所以总体感觉还可以,看了一些基础概念和主题,写了几个测试程序,突然想起来了前一段时间在W ...

  5. java中文乱码解决之道(一)-----认识字符集

    沉寂了许久(大概有三个多月了吧),LZ"按捺不住"开始写博了! java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.c ...

  6. XStream将java对象转换为xml时,对象字段中的下划线“_”,转换后变成了两个的解决办法

            在前几天的一个项目中,由于数据库字段的命名原因 其中有两项:一项叫做"市场价格"一项叫做"商店价格" 为了便于区分,遂分别将其命名为market ...

  7. 懒加载session 无法打开 no session or session was closed 解决办法(完美解决)

           首先说明一下,hibernate的延迟加载特性(lazy).所谓的延迟加载就是当真正需要查询数据时才执行数据加载操作.因为hibernate当中支持实体对象,外键会与实体对象关联起来.如 ...

  8. 使用JSONObject.fromObject的时候出现“There is a cycle in the hierarchy”异常 的解决办法

    在使用JSONObject.fromObject的时候,出现“There is a cycle in the hierarchy”异常.   意思是出现了死循环,也就是Model之间有循环包含关系: ...

  9. iPhone Anywehre虚拟定位提示“后台服务未启动,请重新安装应用后使用”的解决方法

    问题描述: iPhone越狱了,之后在Cydia中安装Anywhere虚拟定位,但是打开app提示:后台服务未启动,请重新安装应用后使用. 程序无法正常使用... 解决方法: 打开Cydia-已安装, ...

随机推荐

  1. Java:多线程,线程池,ThreadPoolExecutor详解

    1. ThreadPoolExecutor的一个常用的构造方法 ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepA ...

  2. REST技术第三步 @BeanParam的使用

    我简介下rest中@BeanParam的使用 我们来做一个计算加法的服务. 提供两个參数a和b,计算出a+b. 參数都在URL里 就是类似这样的效果. 这次用上@BeanParam 首先写个POJO来 ...

  3. [tools]python的mkdocs模块分分钟将md搞成一个网站

    docusaurus: facebook出的一个文档生成器,用起来感觉没那么友善 hugo: 这个很棒 python的mkdocs模块: 用起来最简单 python的这个模块可以分分钟将一坨md假设成 ...

  4. 【Android】3.13 路径规划功能

    分类:C#.Android.VS2015.百度地图应用: 创建日期:2016-02-04 一.简介 线路规划支持以下功能: 公交信息查询:可对公交详细信息进行查询: 公交换乘查询:根据起.终点,查询策 ...

  5. 解决Git在Linux 乱码问题

    在Linux如果要提交的文件名是中文的,默认git commit的时候就会把中文显示为一串数字如下: create mode "\346\265\213\350\257\225" ...

  6. CCNotificationCenter(一)

    const std::string testsName[MAX_COUNT] = { "Bug-350", "Bug-422", "Bug-458&q ...

  7. AngularJS通过$sce输出html的方法

    不知道大家有没有发现在用AngularJS作为前端搭建个人博客的时候,发现用AngularJs输出html的时候,浏览器并不解析这些html标签,这里我们需要其显示angular输出的html能被浏览 ...

  8. vue中sass的配置安装流程

    1.安装node-sass,因为scss是基于此库的 cnpm install --save-dev node-sass 2.安装sass-loader cnpm install --save-dev ...

  9. hive 启动 Specified key was too long; max key length is 767 bytes解决办法

    解决方案: 在mysql机器的上命令行中运行: alter database hivemanual character set latin1; 问题解决.

  10. 关于一个页面的tab切换整体页面刷新而tab标签处是同一个文件怎么做焦点的问题

    解决方法,不能直接写点击效果就要在超链接中加一个参数,根据参数的值去给变焦点的效果,实现方法如下: <div class="vip_search">           ...