升级ASIO async_connect在失败时成功,为什么?
问题描述:
我有一个服务器应用程序,我只接受一个客户端boost::asio::ip::tcp::acceptor
和async_accept
。升级ASIO async_connect在失败时成功,为什么?
我运行客户端应用程序并成功使用boost::asio::ip::tcp::socket
和async_connect
成员函数连接。
然后我让客户端崩溃(CTRL-ALT-DEL)。
如果我重新启动客户端应用程序,并尝试重新连接,它成功...
即使我不重做在服务器端的async_accept
。
这怎么可能?
编辑:
如果服务器应用程序没有运行,则async_connect
失败,因为它应该。
答
这是可能的,因为接受者仍处于聆听状态。处于监听状态时,传入的连接将排队,直到它们被accept()
操作接受。有关受体的状态和操作的更多细节可以在this答案中找到。
为了获得所需的行为,只需在接受连接后接受方close()
。连接关闭后,通过执行open() -> bind() -> listen()
将接受器转换回收听状态。