c++异网正确关闭套接字
空 干读()
{
动 本(从本共享());
套接字_.异步读些(提升::异网::缓冲(数据_,最大长度),[本,本](提升::系统::错误码 ec,大小型 长度){
如(!ec){
干写(长度);
}异{
关闭();
}
});
}
空 关闭(){
套接字_.关闭(异网::ip::传控::套接字::都关闭);
套接字_.关闭();
}//关闭.
只是在异步回调
里,调用没问题,但如果在对象析构
时调用关闭
的话,那么就有问题,因为外面
去关闭socket
的时候,这时候可能正在读写
数据,这样关闭
可能导致无法收到和发送成功
数据,另外一个问题是线程安全
,asio
不保证socket.close
的线程安全.如果内部和外部
同时调用关闭
的话就有竞争,会发生未定义行为.
正确关闭
,应通过io_context
提交关闭
到内部队列
中,触发关闭
时,说明无其它
读写操作了,此时,关闭
它是安全的.
空 关闭(){
io环境_.提交([本,本=从本共享()]{
套接字_.关闭(异网::ip::传控::套接字::都关闭);
套接字_.关闭();
});//提交.
}
再加上防重判断
空 关闭(){
如(有关闭_)中;
io环境_.提交([本,本=从本共享()]{
如(!套接字_.是打开())中;
套接字_.关闭(异网::ip::传控::套接字::都关闭);
套接字_.关闭();
});
有关闭_=真;
}
原子<极>有关闭_=假;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现