boost :: asio :: async_read текстовое условие остановки? - PullRequest
0 голосов
/ 10 марта 2011

Я пишу сервер с Boost, что-то довольно простое - принять сообщение XML, обработать, ответить. Но я сталкиваюсь с проблемой, когда говорю, когда прекратить читать.

Это то, что у меня есть сейчас: (_index - это буфер, в который считываются данные)

std::size_t tcp_connection::completion_condition(const boost::system::error_code& error, 
std::size_t bytes_transferred)
{
    int ret = -1;
    std::istream is(&_index);
    std::string s;
    is >> s;

    if (s.find("</end_tag>") != std::string.npos) ret = 0;
    return ret;
}


void tcp_connection::start()
{
    // Get index from server 
    boost::asio::async_read(_socket, _index, &(tcp_connection::completion_condition), 
        boost::bind(&tcp_connection::handle_read, shared_from_this(), boost::asio::placeholders::error,
      boost::asio::placeholders::bytes_transferred));   
}

Это не компилируется, так как я должен определить завершение_статика как статическое, чтобы передать его async_read; и я не могу определить _index как статический, поскольку (очевидно) мне нужно, чтобы он был специфичным для класса.

Есть ли какой-нибудь другой способ задать параметры для завершения_условия? Как заставить его распознать конечный тег и вызвать обработчик чтения?

1 Ответ

2 голосов
/ 10 марта 2011

Вы можете передавать указатели на функции-члены.Синтаксис для C ++ сложен, но boost::bind скрывает его и делает его довольно простым.

В качестве примера можно было бы сделать completion_condition нестатичным и передать его.async_read как таковой: boost::bind(&tcp_connection::completion_condition, this, _1, _2)

&tcp_connection::completion_condition - указатель на функцию.this - это объект типа tcp_connection для вызова функции._1 и _2 являются заполнителями;они будут заменены двумя параметрами, с которыми вызывается функция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...