我正在使用 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/

10-13 07:45
查看更多