c++异网正确关闭套接字

原文

空 干读()
{
    动 本(从本共享());
    套接字_.异步读些(提升::异网::缓冲(数据_,最大长度),[,](提升::系统::错误码 ec,大小型 长度){(!ec){
         干写(长度);
    }{
         关闭();
    }
    });
}

空 关闭(){
    套接字_.关闭(异网::ip::传控::套接字::都关闭);
    套接字_.关闭();
}//关闭.

只是在异步回调里,调用没问题,但如果在对象析构时调用关闭的话,那么就有问题,因为外面去关闭socket的时候,这时候可能正在读写数据,这样关闭可能导致无法收到和发送成功数据,另外一个问题是线程安全,asio不保证socket.close的线程安全.如果内部和外部同时调用关闭的话就有竞争,会发生未定义行为.
正确关闭,应通过io_context提交关闭内部队列中,触发关闭时,说明无其它读写操作了,此时,关闭它是安全的.

空 关闭(){
    io环境_.提交([,=从本共享()]{
        套接字_.关闭(异网::ip::传控::套接字::都关闭);
        套接字_.关闭();
    });//提交.
}

再加上防重判断

空 关闭(){(有关闭_);
    io环境_.提交([,=从本共享()]{(!套接字_.是打开());
        套接字_.关闭(异网::ip::传控::套接字::都关闭);
        套接字_.关闭();
    });
    有关闭_=;
}

原子<>有关闭_=;
posted @ 2022-07-18 21:15  zjh6  阅读(52)  评论(0)    收藏  举报  来源