为啥 boost::asio::read 缓冲区数据大小小于读取大小?

Posted

技术标签:

【中文标题】为啥 boost::asio::read 缓冲区数据大小小于读取大小?【英文标题】:Why is boost::asio::read buffer data size lesser than read size?为什么 boost::asio::read 缓冲区数据大小小于读取大小? 【发布时间】:2012-03-12 05:30:56 【问题描述】:

我有一个简单的文件传输应用程序,它每次从客户端写入传输 4096 字节。在服务器端,我正在使用以下调用 read

tempLen = boost::asio::read(l_Socket, boost::asio::buffer(buf, bufSize), boost::asio::transfer_all(), 错误);

Templen 是 1440 字节,但是当我读取 buf 时,它只有 11 字节。复制粘贴下面的服务器代码。我已经尝试了 socket.read_some 和 asio::read - 两者都以相同的结果结束。有人可以解释我在这里做错了什么吗?

//boost::array<char, 4096> buf;
char* buf = new char[4096];
char* bigBuffer = new char[2097152];
std::string strBuffer;

strBuffer.clear();

for (;;) // Loop for the whole file length


    boost::asio::read_until(l_Socket, request_buf, "\n\n");
    std::istream request_stream(&request_buf);
    request_stream >> bufSize;
    std::cout<< "Size of the Compressed data transfer:" << bufSize << "\n";

    // Clear the stream
    request_stream.clear();
    memset(bigBuffer, 0, 2097152);
    memset(buf, 0, 4096);

    if(bufSize == 0)
        break;

    size_t len = 0, prevLen = 0, tempLen = 0;

    try

        //tempLen = l_Socket.read_some(boost::asio::buffer(buf, bufSize), error);
        tempLen = boost::asio::read(l_Socket, boost::asio::buffer(buf, bufSize), boost::asio::transfer_all(), error);
        std::cout << "Length from read: " << tempLen << " Buffer Size: " << bufSize << std::endl;
        prevLen = len;

        len += tempLen;

    
    catch (boost::exception& e)
    
         std::cerr << diagnostic_information(e);
    .....

编辑:

刚刚检查过这个问题只有当我在客户端发送使用以下函数压缩的数据时才会发生。

    std::string CClient::Compress(const char* data, unsigned int* dataLen)

    std::stringstream compressed;
    std::stringstream decompressed;
    std::cout << "From Compress Function: " << " Size of Decompressed Data: " << strlen(data) << std::endl;
    decompressed << data;
    boost::iostreams::filtering_streambuf<boost::iostreams::input> out;
    out.push(boost::iostreams::zlib_compressor());
    out.push(decompressed);
    boost::iostreams::copy(out, compressed);
    *dataLen = compressed.str().size();
    return compressed.str();


std::string CClient::DeCompress(const std::string& data)

    std::stringstream compressed;
    std::stringstream decompressed;
    compressed << data;
    boost::iostreams::filtering_streambuf<boost::iostreams::input> in;
    in.push(boost::iostreams::zlib_decompressor());
    in.push(compressed);
    boost::iostreams::copy(in, decompressed);
    std::cout << "Decompressed Data: " << decompressed.str().c_str() << std::endl;
    return decompressed.str();

当我在压缩后(发送前)在“客户端”本身解压缩数据时,数据会被正确打印。但是当我在服务器接收后读取数据时,我遇到了这个问题。

【问题讨论】:

用你使用的语言标记你的问题,你会得到更多的关注。 J.N - 感谢您的建议。会记住这一点。 【参考方案1】:

问题似乎出在压缩功能上。从 Compression 函数返回的字符串,当我将其转换为 c 字符串时,它会终止 11 个字节。我通过实现压缩函数直接调用 zlib 函数并将数据处理为 char 字符串而不是 std::string 解决了这个问题。

【讨论】:

以上是关于为啥 boost::asio::read 缓冲区数据大小小于读取大小?的主要内容,如果未能解决你的问题,请参考以下文章

boost::asio::read 函数挂起

Boost::asio async_read 简单文件上传

为啥 boost asio async_read_some 在特定情况下不调用回调?

实现真正 boost::asio::async_read_until 的最简单方法

Boost asio - 从标准输入异步读取已建立的字符数

传递给 boost::asio::async_read_some 的回调从未在 boost::asio::read_some 返回数据的使用中调用