【问题标题】:How to send large objects using boost::asio如何使用 boost::asio 发送大对象
【发布时间】:2010-05-07 14:47:57
【问题描述】:

美好的一天。

我正在使用 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。 我怀疑这种方法是否可行(因为我在这里有一个指向对象的指针)?或者使用固定大小的数据包(以字节为单位)接收这个对象会更好吗?

提前致谢。

【问题讨论】:

    标签: asynchronous boost boost-asio large-data


    【解决方案1】:

    我认为 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。 如果您想传输复杂的对象,这永远不会有什么坏处。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多