我用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. django1.8高级视图和URL配置读书笔记

    一.在url配置中可以通过导入视图函数来将url模式和对应的函数对象进行映射,也可以通过字符串的形式进行映射.字符串包含应当是模块名.函数名的组合例如: 之前: from mysite import ...

  2. 把git上的larave项目通过SourceTree安装上再通过composer安装依赖库

    1.项目地址克隆 https://gitee.com/fps2tao/laravel5.5-alitaobao.git 通过SourceTree工具下载到本地 2.在命令行方式打开项目地址安装依赖库( ...

  3. unity, shader input and output

    http://wiki.unity3d.com/index.php?title=Shader_Code

  4. CPD轮播广告库的简单算法

    在广告的领域中,有一种广告形式,采用的是CPD的售卖模式,为了对流量进行拆分,媒体方会对广告位进行轮播拆分.比如一个广告位,被拆成了10轮播,那么在广告主来预订广告位的时候,这个时候就可以告诉广告主, ...

  5. 使用jQuery的ajax同步请求吃过的亏

    jQuery是一个非经常常使用的js库.甚至我们开发不论什么一个项目都首先把jquery导入进行.jQuery太过强大,使用起来非常方便.可是在使用的过程中也遇到过非常多坑.我在这里分享一下.避免大家 ...

  6. Vivado使用技巧(二):封装自己设计的IP核

    由 judyzhong 于 星期五, 09/08/2017 - 14:58 发表 概述   Vivado在设计时可以感觉到一种趋势,它鼓励用IP核的方式进行设计.“IP Integrator”提供了原 ...

  7. ThinkPad 预装win8换win7(软激活)

    今天晚上有人叫我给他装系统,没错!这就是计算机专业的拿手技能(维修学院重装系统专业Win7系统班^-^). 一拿手上,是lenovo的ThinkPad E430型号,预装的系统是win8,由于win8 ...

  8. bazel-编译动态库

    demo2_2 使用baze编译动态库 demo2_2目录树 ├── app │ ├── BUILD │ ├── func.cpp │ └── func.hpp ├── README.md └── W ...

  9. C++ 顺序容器原理

    容器分为顺序容器与关联容器,顺序容器也称为序列式容器.序列式容器按元素插入的顺序存储元素,这些元素可以进行排序,但未必是有序的.C++本身内置了一个序列式容器array(数组),STL另外提供了vec ...

  10. FZU Problem 2028 时空门问题

    Problem Description 在一个N*M的地图上旅行.地图上有些地方可以走用. 表示,不能走用 # 表示.在可以走的地方上下左右移动一格需要一个单位时间.可以走的地方还有一些时空之门.时空 ...