关闭和清理套接字的正确方法是什么?
我将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秒),所以我想我做错了一些事情。
发布于 2018-07-22 20:45:09
我想您是在说一个优雅的结尾,即读/写任何未完成的数据,然后关闭套接字。
适当的步骤是:
shutdown()以指示您将不再向套接字写入任何数据。close()套接字(在异步读取处理程序中)。如果不这样做,则可能会在另一方仍在发送数据时关闭连接。这将导致一场不光彩的结局。
cancel()和release()不是在正常流中使用的调用:
cancel()取消所有未执行的异步操作。release()释放底层本机套接字的所有权。https://stackoverflow.com/questions/51468848
复制相似问题