c++ asio socket 关闭不了_asio ssl stream关闭的问题

诡异的关闭连接触发断言的错误

最近在重构http client遇到一个诡异的问题,每次定时器超时去关闭连接之后就会出现一个读缓冲区的断言错误,错误信息如下:

ddc141172809b7a5af47643e61949972.png b9c16ee48fad7da1fcc417c9fb51fc33.png

从堆栈信息看是asio::streambuf缓冲区非法引起的,只有异步读的时候才会用到这个缓冲区,以前关闭连接都没有遇到过这种问题,不知道怎么突然冒出这种问题。

排查了一天终于发现是http client的ssl stream关闭导致的问题,ssl stream shutdown的时候会清空streambuf缓冲区,等到异步读回调的时候发现缓冲区没了,就触发了这个断言错误。

找到问题的原因之后解决起来也很容易:定时器超时的时候只关闭socket,不去shutdown ssl stream,socket关闭会导致读错误发生,这时候才去关闭ssl stream,因为后面不可能有异步读事件了,不会再去用streambuf了。

一点感想

异步网络编程是复杂的,尤其是当异步遇上多线程,就更复杂了,要驾驭asio开发高性能稳定的服务器还真是需要经验和功夫。

asio网络库即跨平台,又能把性能做到极致,深入去研究它是非常值得的,而且asio将要作为c++23的网络库,前景很好,值得我们好好去研究。

一旦你掌握了asio,你会发现用它做高性能服务器或者网络应用是那么地游刃有余。asio你值得拥有!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值