非阻塞套接字中SSL_read_ex读取异常:请求谷歌无效资源时卡壳
非阻塞套接字下SSL_read_ex请求无效资源的阻塞问题及解决
问题现象
在非阻塞套接字环境中使用SSL_read_ex时出现异常:请求谷歌正常资源(如GET /)可正常获取页面,但请求无效资源(例如在https://www.google.com/后追加无效路径)时,程序完全失效。
背景与实现流程
为自研解释器开发libssl封装库,用于HTTP库访问HTTPS站点,采用非阻塞套接字进行数据交互,当前SSL读取流程为:
- 调用
SSL_read_ex,若读取到数据则直接返回给用户 - 若返回
SSL_ERROR_WANT_READ,先检查out_bio是否有待发送数据,如有则发送后重新监听套接字 - 将套接字接收到的数据写入in_bio,再次调用
SSL_read_ex
排查过程
- 上述流程在多数场景下正常运行,但请求谷歌不存在的页面时,封装库会卡在
SSL_ERROR_WANT_READ状态无法继续 - 通过Wireshark抓包确认,套接字无后续数据包传输,排除事件循环本身的问题
- 对比wget的数据包,发现与封装库的请求数据包无差异,但wget能正常接收404响应,而封装库无法完成读取
解决办法
设置SSL_MODE_AUTO_RETRY标志,并启用SSL_set_read_ahead后,问题得到解决。
内容的提问来源于stack exchange,提问作者jdl
相关产品推荐
相关产品推荐

