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

原文

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

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

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

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

再加上防重判断

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

原子<极>有关闭_=假;
posted @   zjh6  阅读(32)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示