• 解决ERROR_INVALID_USER_BUFFER


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

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

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

    readSize
  • 相关阅读:
    一些C++11语言新特性
    项目管理计划应该包括哪些内容
    真相令人震惊!为什么越有钱的人,欠的钱越多?
    80后小伙返乡创业种植中药材,带领乡亲们脱贫致富
    Tableau
    知识点汇总
    决策树分析、EMV(期望货币值)
    信息系统项目管理师60天冲刺复习计划,2019下半年高项冲刺计划
    【系统分析师之路】系统分析师备考计划
    有一种规律:“劣币驱逐良币”,“坏人淘汰好人”(深度)
  • 原文地址:https://www.cnblogs.com/dvwei/p/3427154.html
Copyright © 2020-2023  润新知