你的客户挂在这条线上
boost::asio::read(socket, response);
因为上面和
是一样的
boost::asio::read(socket, response, boost::asio::tranfer_all());
the documentation 中描述的内容。
您使用 read 过载,它采用完成条件。这些函子分为三种:transfer_all_t、transfer_exactly_t 和transfer_at_least_t。他们每个人都有operator()(),如果读取操作完成,则返回0 - see reference。
transfer_all_t::opeator()() 的代码是:
template <typename Error>
std::size_t operator()(const Error& err, std::size_t)
{
return !!err ? 0 : default_max_transfer_size;
}
所以只有在发生错误时才返回 0。
transfer_at_least_t::operator()() 是:
template <typename Error>
std::size_t operator()(const Error& err, std::size_t bytes_transferred)
{
return (!!err || bytes_transferred >= minimum_)
? 0 : default_max_transfer_size;
}
如您所见,如果发生错误或至少传输了 minimum_ 个字节,则返回 0。
如果您知道read 和transfer_all 在发生错误时结束,您可以创建此错误以查看读取数据。您可以在服务器端关闭套接字(用于发送操作)或关闭此套接字。然后您可以更改read 调用以获取error_code,您应该会看到文件结束为错误:
boost::system::error_code ec;
boost::asio::read(socket,response,ec);
if (ec)
{
cout << ec.message() << endl; // End of file
// if ec is End of file you can see what data was read into streambuf
}
您发送一个序列化对象,因此您知道该对象的大小,为什么不使用发送对象大小的方法(例如 4 个字节),然后在此标头之后发送对象的内容。
在客户端:
array<char,4> length;
boost::asio::read(socket,boost::asio::buffer(length));
int contentLen = /*conversion from length array into integer */
vector<char> content( contentLen );
boost::asio::read(socket,boost::asio::buffer(content));