无以太网连接时SSL_write返回正值的原因及数据传输校验方法
为什么无网络连接时SSL_write仍返回正值
首先明确核心结论:SSL_write的返回值仅代表数据被成功写入OpenSSL内部的发送缓冲区,和数据是否实际通过网络发送到对端没有直接关联。
具体原因如下:
- SSL/TLS是工作在TCP传输层之上的加密协议,
SSL_write执行时仅完成两个核心操作:将传入的明文加密为标准TLS记录、将加密后的记录写入操作系统内核的Socket发送缓冲区。只要这两个操作没有报错,SSL_write就会返回传入的字节长度作为成功返回值。 - 无网络连接时,只要内核对应的Socket发送缓冲区还有剩余空间、且TCP连接还没有被内核标记为异常(比如还未触发超时重传上限、还未收到RST复位包),写入缓冲区的操作就会正常执行,
SSL_write自然会返回正值。
你原有的业务逻辑存在判断误区:
if (SSL_write(ssl, chars, strlen(chars)) <= 0) { Init(); } else { .... }
以上判断只能捕获SSL层连接异常、缓冲区写满这类即时错误,完全无法判断网络是否正常、数据是否已经成功发送到对端。
如果需要实现准确的发送校验,可采用以下方案:
- 业务层新增应答机制:对端收到数据后必须返回业务ACK包,发送方收到该ACK后才判定数据发送成功
- 开启TCP KeepAlive机制,或者定期调用
getsockopt获取SO_ERROR选项检测Socket连接状态 - 不要只依赖
SSL_write的返回值做重连判断,后续调用SSL_read、SSL_shutdown等函数返回异常时,也要执行重连逻辑
内容的提问来源于stack exchange,提问作者tryingBetter
相关产品推荐
相关产品推荐

