gpt4 book ai didi

c++ - 为什么 boost::asio::read 缓冲区数据大小小于读取大小?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:19:23 26 4
gpt4 key购买 nike

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

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();
}

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

最佳答案

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

关于c++ - 为什么 boost::asio::read 缓冲区数据大小小于读取大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9662161/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com