0

良い一日。

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。そのアプローチが可能かどうかは疑問です(ここにオブジェクトへのポインタがあるため)?または、バイト単位の固定サイズのパケットを使用してこのオブジェクトを受信するにはどうすればよいでしょうか?

前もって感謝します。

4

1 に答える 1

0

boost.asio ドキュメントの http_client の例は、私ができるよりもうまく説明していると思います

パケットについて気にする必要はありません。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 などのシリアライゼーションも検討する必要があります。複雑なオブジェクトを転送したい場合は、これで問題ありません。

于 2010-05-10T20:52:00.890 に答える