0
点赞
收藏
分享

微信扫一扫

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


​​原文​​

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

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

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

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

再加上​​防重判断​

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

原子<>有关闭_=;


举报

相关推荐

0 条评论