哪种方法是关闭和清理插座的正确方法?
我的io_service在辅助线程中运行,我需要关闭与主线程的连接:
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秒),所以我想我做错了。
答案 0 :(得分:3)
我假设您正在谈论正常关闭,即读取/写入所有未完成的数据,然后关闭套接字。
正确的步骤是:
调用Error C2143 syntax error: missing ';' before '* main.h 8
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int main.h 8
表示您不会再向套接字写入任何数据。
继续从套接字读取(async-),直到出现错误或连接被关闭。
现在shutdown()
是套接字(在异步读取处理程序中)。
如果不这样做,您可能最终在另一端仍在发送数据的同时关闭连接。这将导致不愉快的关闭。
close()
和cancel()
不是您在常规流程中使用的电话:
release()
取消所有未完成的异步操作。cancel()
释放对基础本机套接字的所有权。