C++ Asio终端插座功能:取消、关闭、关闭、释放
关闭和清理插座的正确方法是什么 我在次线程中运行io_服务,需要关闭与主线程的连接:C++ Asio终端插座功能:取消、关闭、关闭、释放,c++,boost-asio,C++,Boost Asio,关闭和清理插座的正确方法是什么 我在次线程中运行io_服务,需要关闭与主线程的连接: void closeConnection() { ioc.post([&socket]() { // Which ones do I have to call? // In what order? // What do they do? //socket.cancel(); //socket.shutdown(asi
void closeConnection()
{
ioc.post([&socket]() {
// Which ones do I have to call?
// In what order?
// What do they do?
//socket.cancel();
//socket.shutdown(asio::ip::tcp::socket::shutdown_both);
//socket.close();
//socket.release();
});
secondaryThread.join();
}
所有这些功能之间的区别是什么
我试过这个序列
socket.cancel();
socket.close();
socket.release();
而且似乎关闭连接时没有出现错误,但需要花费太多时间(大约5-10秒),因此我猜我做错了什么。我想你说的是一个优雅的关闭,即读取/写入任何未完成的数据,然后关闭套接字 正确的步骤是:
shutdown()
close()
socket(在异步读取处理程序中)cancel()
和release()
不是您在正常流中使用的调用:
取消所有未完成的异步操作cancel()
释放底层本机套接字的所有权release()
cancel()
取消异步读取?谢谢这就是shutdown()
的作用-它会导致任何正在进行的异步读取以“socket closed”错误结束,此时您可以close()
套接字。好的,如果我理解正确,shutdown
执行所有操作cancel
does plus不允许将来的操作?@tuket不是真的。shutdown
功能启动插座的关闭。如果另一方向您发送数据,则未完成的读取可能会完成。cancel
函数取消未完成的异步操作,这会造成混乱。假设当时有数据在向您传输——如果取消未完成的异步操作,您将如何接收该数据?啊,我明白了。谢谢!原来我的代码中有一个愚蠢的错误。在处理read\u async
的函数中,我发布了另一个read\u async
,即使错误代码是false
。我仍然认为澄清所有这些函数的作用会很有趣。