Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ asio异步读取保证读取所有字节_C++_Asynchronous_Boost Asio - Fatal编程技术网

C++ asio异步读取保证读取所有字节

C++ asio异步读取保证读取所有字节,c++,asynchronous,boost-asio,C++,Asynchronous,Boost Asio,我有一个服务器,它从客户端接收一个用zlib压缩的压缩字符串,我使用boost::asio库的async_receive来接收这个字符串,但事实证明不能保证所有字节都会被接收,所以我现在必须将它改为async_read。我面临的问题是,接收的字节大小是可变的,因此我不知道如何在不知道要接收的字节数的情况下使用async_read。对于async_receive,我只有一个boost::array,但这是一个缓冲区,不一定完全填满 我想知道是否有人可以建议一种解决方案,即使我不知道要提前接收的字节

我有一个服务器,它从客户端接收一个用zlib压缩的压缩字符串,我使用boost::asio库的async_receive来接收这个字符串,但事实证明不能保证所有字节都会被接收,所以我现在必须将它改为async_read。我面临的问题是,接收的字节大小是可变的,因此我不知道如何在不知道要接收的字节数的情况下使用async_read。对于async_receive,我只有一个boost::array,但这是一个缓冲区,不一定完全填满

我想知道是否有人可以建议一种解决方案,即使我不知道要提前接收的字节数,我也可以使用async_read

void tcp_connection::start(boost::shared_ptr<ResolverQueueHandler> queue_handler)
{
    if (!_queue_handler.get())
        _queue_handler = queue_handler;

    std::fill(buff.begin(), buff.end(), 0);

    //socket_.async_receive(boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error));
    boost::asio::async_read(socket_, boost::asio::buffer(buff), boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error));
}

buff是一个boost::array

使用并创建您自己的,或者更改协议以发送包含压缩字符串中预期字节数的标头。

您希望如何使用任何其他方法执行此操作

在异步manor中发送可变大小数据有几种通用方法:

按消息-意味着您有一个定义预期消息长度的标头,后跟一个包含指定长度数据的正文。 通过流-意味着你有一些标记,这是一个非常广泛的方法,知道你什么时候得到了一个完整的数据包。 按连接-每个完整的数据包在单个连接中发送,该连接在数据完成后关闭。
因此,您的数据可以被解析,或发送长度等。

单个IP数据包的MTU大小限制在1500字节左右,但您仍然可以从您喜爱的网站下载千兆字节的大文件,并在YouTube上观看兆字节大小的视频

您需要发送一个指示原始数据实际大小的头,然后以较小的数据块逐块接收数据,直到接收完所有字节


例如,当您通过HTTP下载一个大文件时,头上有一个字段指示文件的大小:Content Length:。

@b.g.您的评论不正确,只需阅读已接受的答案,您就会看到第1项是内容长度的一般情况。@b.g.再次阅读代码和问题:它与TCP解析无关。用户需要知道recv中的数据是否都是发送方发送的。