在读取之前检查boost :: asio socket上的数据?或者我应该使用async_read()?

时间:2012-03-22 20:40:13

标签: c++ boost-asio

我是socket IO的新手。我一直在使用socket::read_some()从套接字中提取数据。我相信我比套接字上的数据更经常地询问套接字数据,所以看起来'read_some()`的阻塞性质正在减慢我的程序执行到数据来自套接字的速率。我想检查数据然后继续,如果没有任何东西。我的代码目前看起来像这样:

unsigned char incomingData[PARTIAL_PKT_BUFF_SIZE];
int numRead = 0;
numRead =
  _socket.read_some(boost::asio::buffer(incomingData,PARTIAL_PKT_BUFF_SIZE));

如果我在this question的第一个答案中实现代码,看起来我将使用bytes_readable对象来控制套接字,然后我可以检查是否{{1返回大于零然后读取套接字。

看起来像async_read()可能会完成这项工作,但我必须承认我并不是真的理解它。看起来我需要注册一个回调,这表明我可能需要在缓冲区周围放置一些安全机制。我认为这是一个更复杂的解决方案吗?

2 个答案:

答案 0 :(得分:2)

  

我想查看数据,然后继续进行,如果没有任何内容

您刚刚描述了称为民意调查的方法。

  

看起来async_read()可能会完成这项工作,但我必须承认我   不太了解它。

正确,async_read()是完美的解决方案。

  

看起来我需要注册一个   回调,这表明我可能需要放一些安全措施   缓冲区周围的机制。我是否正确地认为这是一个更多   复杂的解决方案?

您需要回调事件循环,以便在读取操作完成时通知您的应用程序。您不需要任何安全机制。一旦您将头部绕过倒置流量控制器,它就不是一个复杂的解决方案。有几个examples和一个tutorial向您展示如何编写异步I / O程序。如果遇到问题,请研究它们并在Stackoverflow上提问。

答案 1 :(得分:0)

asio::streambuf s_buf;
asio::async_read_until(sock, s_buf, '\n', std::bind(completionHandler, std::placeholders::_1));
std::string message;
std::istream input_stream(&s_buf);
std::getline(input_stream, message);
std::cout << message << std::endl;
// Whenever it successfully read an entire message ; it will call the function completion handler. 
void completionHandler(const boost::system::error_code& ec)
{
    if (ec != 0)
    {
        std::cout << "Error occured! Error code = " << ec.value() << ". Message: " << ec.message();
        return;
    }
}