美好的一天。
我使用boost :: asio通过网络接收大型对象。
我有一个代码:
for (int i = 1; i <= num_packets; i++)
boost::asio::async_read(socket_, boost::asio::buffer(Obj + packet_size * (i - 1), packet_size), boost::bind(...));
My_Class * Obj
。
我怀疑这种方法是否可行(因为我有一个指向对象的指针)?或者如何使用固定大小的数据包接收此对象更好?
提前致谢。
答案 0 :(得分:0)
我认为boost.asio文档中的http_client示例比我能更好地解释它: http://www.boost.org/doc/libs/1_43_0/doc/html/boost_asio/example/http/client/async_client.cpp
您不需要打扰数据包,获得TCP流,并从属于该流的套接字读取。故事结束。
你需要这样的东西,不同之处在于你不会将响应读入std :: cout,而是从中重建你的对象(不确定这是否适用于对象,或只是简单类型)。
class client
{
...
void handle_read_content(const boost::system::error_code& err)
{
if (!err)
{
// Write all of the data that has been read so far.
std::cout << &response_;
// Continue reading remaining data until EOF.
boost::asio::async_read(socket_, response_,
boost::asio::transfer_at_least(1),
boost::bind(&client::handle_read_content, this,
boost::asio::placeholders::error));
}
else if (err != boost::asio::error::eof)
{
std::cout << "Error: " << err << "\n";
}
}
...
boost::asio::ip::tcp::socket socket_;
boost::asio::streambuf response_;
};
您还应该查看序列化,例如Boost.Serialization。 如果你想传递复杂的物体,那绝不会伤害。