Как отправить большие объекты, используя boost :: asio - PullRequest
0 голосов
/ 07 мая 2010

Добрый день.

Я получаю большие объекты через сеть, используя 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. Я сомневаюсь, что такой подход возможен (потому что у меня есть указатель на объект здесь)? Или как было бы лучше получить этот объект, используя пакеты фиксированного размера в байтах?

Заранее спасибо.

1 Ответ

0 голосов
/ 11 мая 2010

Я думаю, что пример http_client в документации boost.asio объясняет это лучше, чем я могу: 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. Это никогда не повредит, если вы хотите передавать сложные объекты.

...