2010-05-07 56 views
0

美好的一天。如何使用boost :: asio发送大对象

我通过网络使用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

我觉得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。 如果您想传输复杂的对象,永远不会伤害。