尝试用boost::asio::async_read替换我的boost::asio::read

3

因此,我开始使用的代码是可以工作的(下面有重要的注意事项)

int reply_length = boost::asio::read(*m_socketptr, boost::asio::buffer((char*)reply, 6));

这个方法是有效的,我可以获取到头部信息,然后解码并进行另一个读取操作,以获取我的消息。然后我会回到顶部并读取另一个头部信息。但是这样会使我的CPU占用率达到100%,因此我想用以下内容替换上面的头部读取操作:

m_socketptr->async_read_some(boost::asio::buffer(m_data, 6), boost::bind(&CSListener::handleRead, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

或者

boost::asio::async_read(*m_socketptr, boost::asio::buffer(m_data, 6), boost::bind(&CSListener::handleRead, this, boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

无论我如何编码,handleRead方法都没有被调用。帮帮我吧!感激不尽!

你能发更多的代码吗?这将有助于了解你如何使用io_service以及如何处理额外的线程。 - nabulke
谢谢nabulke,这是对io_service的误用。 - shaz
1个回答

8
我假设您已经在代码中创建了一个 io_service?您需要调用其 io_service.run() 或者 io_service.run_one() 来使其工作。如果您需要它是异步的,那么 run_one() 是您的选择;将其调用放在您应用程序/线程的主循环中即可。

是的,我在主线程中有一个io_service。我使用它来创建一个shared_ptr到boost :: asio :: ip :: tcp :: socket,然后将其传递给从中读取的线程。 - shaz
1
@shaz 但你是调用 run 还是 run_one 函数呢?这两个函数才是真正工作的函数。 - Gianni

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接