如何确定是否有可以从boost :: asio中的套接字读取数据?

时间:2009-12-15 22:02:30

标签: c++ boost-asio

我正在使用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。除非调用了写请求,否则我需要再次读取...它似乎......好吧,我现在至少可以使用它。

2 个答案:

答案 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,您可能只想在调用读取处理程序时发布另一个读取请求。