我正在使用Boost ASIO库来编写TCP客户端程序。
当你连接时,协议以横幅线开头,然后是'\ r \ n' 我可以随时发送命令,就像smtp一样。
然而,当我不要求时,服务器也可以向我发送数据,并且以'\ r \ n'
终止它我有一条这样的行来阅读和解析初始连接横幅 这意味着,当我得到“\ 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”, 提高::绑定(安培;客户:: HandleReadRequest, 这个, 提高:: ASIO ::占位符::错误)); 表示当响应缓冲区中出现\ r \ n时,将调用HandleReadRequest函数。我只需要调用一次async_read_until。除非调用了写请求,否则我需要再次读取...它似乎......好吧,我现在至少可以使用它。
答案 0 :(得分:3)
通过浏览documentation,我会选择socket_base::bytes_readable
,如下所示:
boost::asio::ip::tcp::socket socket(io_service);
...
boost::asio::socket_base::bytes_readable command(true);
socket.io_control(command);
std::size_t bytes_readable = command.get();
答案 1 :(得分:2)
通常在asio中使用异步操作时,不需要“窥视”。当数据可用时,asio会通过调用您提供的处理函数告诉您。如果您的处理程序尚未被调用,则没有可用的数据。
如果你在套接字上“偷看”,我怀疑它不会像你期望的那样工作,因为数据将被asio读取并在它可用时立即传递给读处理程序,它只会“准备好”读取“在调用处理程序时的微小间隔。虽然只要在套接字上没有启动async_read
,它就可以工作。
对于async_read_until
,您可能只想在调用读取处理程序时发布另一个读取请求。