我正在使用 Boost ASIO 库来编写 TCP 客户端程序。
当您连接时,协议(protocol)以标题行开头,后跟“\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";
}
}
好的,我想我现在明白了。我没有看到一个足够完整的例子来建立我的代码。
它看起来像调用:
最佳答案
看一眼 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();
关于c++ - 如何确定是否有可从 boost::asio 中的套接字读取的数据?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1910715/