C++ boost asio传输_精确读取0字节

C++ boost asio传输_精确读取0字节,c++,c++11,networking,boost,boost-asio,C++,C++11,Networking,Boost,Boost Asio,给定一个通过tcp传输文件内容的示例服务器- #include <vector> #include <fstream> #include <iostream> #include <boost/asio.hpp> using namespace boost::asio; using namespace boost::system; using namespace boost::asio::ip; using std::cerr; using st

给定一个通过tcp传输文件内容的示例服务器-

#include <vector>
#include <fstream>
#include <iostream>
#include <boost/asio.hpp>

using namespace boost::asio;
using namespace boost::system;
using namespace boost::asio::ip;

using std::cerr;
using std::endl;
using std::ifstream;
using std::vector;
using std::ios;
using stream_iter = std::istreambuf_iterator<char>;

int main()
{
    ifstream input("movie.ogv", ios::in | ios::binary);
    vector<uint8_t> stream((stream_iter(input)), stream_iter());

    io_service ioservice;
    tcp::acceptor acceptor(ioservice, tcp::endpoint(tcp::v4(), 8000));
    tcp::socket socket(ioservice);
    acceptor.accept(socket);

    error_code ec;
    write(socket, boost::asio::buffer(stream), ec);
    if (ec) {
        cerr << ec.message() << endl;
    }
}

total_transfer
报告
30800
,我现在可以在循环中修剪并附加到我的
向量中。但是为什么第一种方法在这里不起作用呢?

根据
boost::asio::read()
的文档:

调用将被阻止,直到下列条件之一为真:

  • 提供的缓冲区已满。也就是说,传输的字节等于缓冲区大小之和
  • 完成条件函数对象返回0
您遇到了第一个条件,因为您正在传递一个0大小的缓冲区

你所需要做的就是改变

headerBytesBuf.reserve(header_size_);


要解决此问题。

不是100%确定,但我认为您需要更改
headerBytes buf.reserve(header\u size\u)
头字节buf.resize(头大小),因为ASIO缓冲区在初始化后处理原始数据,所以无法调整向量大小。您正在有效地传递一个0大小的缓冲区,这将触发
提供的缓冲区已满。
条件立即生效。
std::array<char, 128> buf;
size_t total_transfer = 0;

while(total_transfer < header_size_) {
    size_t len = socket.read_some(boost::asio::buffer(buf));
    total_transfer += len;
    if (len <= 0) break;
}
headerBytesBuf.reserve(header_size_);
headerBytesBuf.resize(header_size_);