诡异的关闭连接触发断言的错误
最近在重构http client遇到一个诡异的问题,每次定时器超时去关闭连接之后就会出现一个读缓冲区的断言错误,错误信息如下:
从堆栈信息看是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你值得拥有!