Я использую библиотеку Boost ASIO для написания клиентской программы TCP.
Протокол начинается со строки баннера при подключении, после которой следует '\ r \ n'
Я могу отправлять команды в любое время так же, как SMTP.
Однако сервер также может отправлять мне данные, когда я их не запрашиваю, и они завершаются с помощью \ r \ n * 1005
У меня есть строка, подобная этой, чтобы прочитать и проанализировать начальный баннер подключения
Что означает, прекратить чтение, когда я получу "\ r \ n".
boost::asio::streambuf response_;
...
boost::asio::async_read_until(socket_, response_, "\r\n",
boost::bind(&PumpServerClient::HandleReadBanner, this,
boost::asio::placeholders::error));
Но в разное время я хочу задать вопрос, есть ли данные? если есть, читайте до "\ r \ n". Я чувствую, что мне нужна функция просмотра, но я не вижу, где это.
Хорошо, возможно, я смогу снова вызвать async_read_until. Но учти это ... это никогда не заканчивается.
Отладка продолжающегося чтения появляется один раз. Очевидно, он ждет вечно, чтобы завершить, но никогда не делает.
void client::HandleReadRequest(const boost::system::error_code& err)
{
if (!err){
// Got some data, print it out
std::ostringstream ss;
ss << &response_;
std::cout << ss.str() << std::endl;
// Keep reading...
boost::asio::async_read_until(socket_, response_, "\r\n",
boost::bind(&client::HandleReadRequest, this, boost::asio::placeholders::error));
std::cout << "keep reading" << std::endl;
}
else
{
std::cout << "Error: " << err.message() << "\n";
}
}
Хорошо, я думаю, я понял это сейчас. Я не смотрел на достаточно полный пример, чтобы основывать свой код.
Это похоже на вызов:
повышение :: ASIO :: async_read_until (socket_,
response_, "\ r \ n",
повышение :: Bind (и клиент :: HandleReadRequest,
этот,
повышение :: ASIO :: заполнители :: ошибок));
означает, что когда в буфере response_ появляется \ r \ n, вызывается функция HandleReadRequest. Мне нужно только вызвать async_read_until один раз. если не вызван запрос на запись, тогда мне нужно снова выполнить чтение ... кажется ... ну, теперь он работает по крайней мере.