Boost::ASIO多次调用async_resolve阻塞,事件处理器无响应求助
Boost::ASIO重复async_resolve挂起问题的排查与解决
核心原因与解决方案
1. Resolver未重置/取消未完成操作
Boost ASIO的tcp::resolver对象在存在未完成的异步resolve操作时,直接再次调用async_resolve会导致内部状态冲突,进而引发后续操作挂起。你可以通过两种方式解决:
方式一:取消未完成的resolve操作
在发起新的resolve请求前,调用cancel()终止所有未完成的异步操作,此时之前的回调会以boost::asio::error::operation_aborted错误码触发,你可以在回调中处理该错误并清理状态:
// 再次发起resolve前取消旧操作 if (hostResolver) { hostResolver->cancel(); } // 发起新的resolve请求 hostResolver->async_resolve(boost::asio::ip::tcp::v4(), newHostName, newPortString, boost::bind(&DTcpSocket::resolveFinished, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator));
方式二:每次创建新的Resolver实例
避免复用同一个resolver对象,每次resolve前销毁旧实例并创建新对象(注意内存管理,防止泄漏):
// 清理旧的resolver if (hostResolver) { delete hostResolver; hostResolver = nullptr; } // 创建新resolver并发起请求 hostResolver = new boost::asio::ip::tcp::resolver(*internalEventPump->getIoService()); hostResolver->async_resolve(boost::asio::ip::tcp::v4(), hostName, portString, boost::bind(&DTcpSocket::resolveFinished, this, boost::asio::placeholders::error, boost::asio::placeholders::iterator));
2. 检查Io_service运行状态
确认internalEventPump->getIoService()返回的io_service是否持续正常运行:如果io_service被停止或阻塞,所有后续异步操作的回调都无法触发。确保事件循环(比如io_service.run())一直在后台运行,没有被意外终止。
3. 迭代器资源清理
你的resolveFinished回调中只处理了第一个端点并移动了迭代器,建议在发起新resolve前重置endPointIter等相关状态,避免上下文混乱导致的隐性问题。
内容的提问来源于stack exchange,提问作者Ebonair
相关产品推荐
相关产品推荐

