Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Asio终端插座功能:取消、关闭、关闭、释放_C++_Boost Asio - Fatal编程技术网

C++ Asio终端插座功能:取消、关闭、关闭、释放

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

关闭和清理插座的正确方法是什么

我在次线程中运行io_服务,需要关闭与主线程的连接:

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()
      释放底层本机套接字的所有权

    我的应用程序是一个聊天客户端,它正在等待异步读取,它不会卡在2中吗?我可以用
    cancel()
    取消异步读取?谢谢这就是
    shutdown()
    的作用-它会导致任何正在进行的异步读取以“socket closed”错误结束,此时您可以
    close()
    套接字。好的,如果我理解正确,
    shutdown
    执行所有操作
    cancel
    does plus不允许将来的操作?@tuket不是真的。
    shutdown
    功能启动插座的关闭。如果另一方向您发送数据,则未完成的读取可能会完成。
    cancel
    函数取消未完成的异步操作,这会造成混乱。假设当时有数据在向您传输——如果取消未完成的异步操作,您将如何接收该数据?啊,我明白了。谢谢!原来我的代码中有一个愚蠢的错误。在处理
    read\u async
    的函数中,我发布了另一个
    read\u async
    ,即使错误代码是
    false
    。我仍然认为澄清所有这些函数的作用会很有趣。