Asio终端套接字功能:取消,关闭,关闭,释放

时间:2018-07-22 20:06:08

标签: c++ boost-asio

哪种方法是关闭和清理插座的正确方法?

我的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秒),所以我想我做错了。

1 个答案:

答案 0 :(得分:3)

我假设您正在谈论正常关闭,即读取/写入所有未完成的数据,然后关闭套接字。

正确的步骤是:

  1. 调用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 表示您不会再向套接字写入任何数据。

  2. 继续从套接字读取(async-),直到出现错误或连接被关闭。

  3. 现在shutdown()是套接字(在异步读取处理程序中)。

如果不这样做,您可能最终在另一端仍在发送数据的同时关闭连接。这将导致不愉快的关闭。


close()cancel()不是您在常规流程中使用的电话:

  • release()取消所有未完成的异步操作。
  • cancel()释放对基础本机套接字的所有权。
相关问题