我使用boost :: asio库实现了客户端服务器程序。 在我的实现中,有时io_service.run()无限期地阻塞。如果我将另一个请求传递给io_service,阻塞的调用将开始正常执行。
有没有办法查看io_service队列中的待处理请求是什么?
我没有使用工作对象来阻止运行调用!
答案 0 :(得分:0)
现在我花了几个小时阅读和试验(我还需要更多的boost :: asio功能),事实证明:有点儿。 但它并不像人们希望的那样简单或可读。
引擎盖下(好吧,在最外面的引擎盖下)io_service注册了一堆其他服务,它们执行各自领域所需的工作async_
。
这些是参考文献中描述的“服务”。
现在可悲的是,服务保持登记状态,是否有工作要做。例如,如果你的io_service有一个udp套接字,它仍然会有所有相应的服务,即使套接字本身是不活动的。
但是你可以问你的io_service它有哪些服务。假设您想知道名为m_io_service
的io_service是否具有udp datagram_socket_service
。然后你可以打电话给:
if (boost::asio::has_service<boost::asio::datagram_socket_service<boost::asio::ip::udp> >(m_io_service))
{
//Whatever
}
这没有多大帮助,因为无论套接字是否活动,它都是真的。但是,在您知道,您拥有该服务之后,您可以使用use_service
代替has_service
来获取该服务,但使用相同优雅的&lt;&gt;。
现在,您可以检查服务以查看它的功能。遗憾的是,它不会告诉你优秀的处理程序名称是什么(可能部分是因为它不知道它们)但是如果它是一个套接字,你可以得到它implemention_type
并检查它当前是否{{1}或者找到is_open
以及local_endpoint
。
如果是remote_endpoint
,除了其他内容之外,您还可以找到deadline_timer_service
的时间。
有关该服务的详细信息,请参阅参考资料,并且不愿意告诉您。 http://www.boost.org/doc/libs/1_54_0/doc/html/boost_asio/reference.html
然后,希望此信息可以帮助您确定哪些expires_at
操作未返回。
如果没有,至少可以async_
任何意外活跃的服务。
答案 1 :(得分:0)
没有官方方法可以查询io_service
以查找所有待处理的请求。但是,有一些技术可以调试问题:
BOOST_ASIO_ENABLE_HANDLER_TRACKING
和Boost.Asio就会将调试输出(包括时间戳,标识符和操作类型)写入标准错误流。epoll_reactor
的操作队列。最后,如果您认为它是一个错误,那么可能值得更新到最新版本或检查revision history相关更改。无论如何,更详细地描述问题可能会让其他人帮助确定问题的根源和潜在的解决方案。