各路大/神帮我看一看start_accept()函数中bind绑定的handle_accept函数不会被调用,客户端明明已经传来链接成功的消息了
Server::Server(boost::asio::io_context& ioc, short port) :_ioc(ioc),
_acceptor(ioc, tcp::endpoint(tcp::v4(), port)) {
start_accept();
}
void Server::start_accept() {
Session* new_session = new Session(_ioc);
_acceptor.async_accept(new_session->Socket(),
std::bind(&Server::handle_accept, this, new_session, placeholders::_1));
}
void Server::handle_accept(Session* new_session, const boost::system::error_code& error) {
if (!error) {
new_session->Start();
}
else {
delete new_session;
}
start_accept();
}
首先确认boost::asio::io_context
正在运行,boost::asio::io_context::run
方法需要在某个线程上调用,以便处理所有待处理的异步操作。如果这个方法没有被调用,或者在你调用async_accept
之前已经返回,那么你的handle_accept
将不会被调用。
其次,你需要检查handle_accept
方法的签名是否和你在std::bind
中预期的一致。看起来你的签名是正确的,但是如果你的handle_accept
有不同的签名(例如,参数的类型或者数量不同),那么std::bind
将不能正确绑定,并且async_accept
将无法调用它。
另外,确认_acceptor
是否正确打开并绑定到了正确的端口,同时没有其他的应用程序在使用相同的端口。
如果以上这些都没有问题,那么可能是代码的其他地方存在问题。在boost::asio
程序中定位问题有时可能会很困难,一个有效的策略是添加更多的错误检查和日志输出。例如,你可以检查async_accept
的错误代码参数,或者在你的handle_accept
方法的开始和结束处添加日志输出。
最后,你需要确保服务器在客户端连接后持续运行,而不是在启动后立即退出。boost::asio::io_context::run
方法将阻塞其调用线程,直到没有更多的工作要做(也就是没有等待的异步操作)。如果你的程序在其他地方退出(例如,因为main
函数返回),那么handle_accept
将不会被调用。如果可能,确保你的io_context
在你的程序的整个生命周期内都保持运行状态。