You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASIO SSL套接字非阻塞模式写入异常问题咨询

ASIO中非阻塞SSL套接字的写入问题

套接字类型说明

  • 非SSL套接字类型:asio::ip::tcp::socket,它是asio::basic_stream_socket<asio::ip::tcp>的别名
  • SSL套接字是普通套接字的包装类型:asio::ssl::stream<asio::ip::tcp::socket>

问题场景

尝试调用socket_type.write_some()向浏览器发送2MB视频文件:

  • 使用非SSL套接字时,调用返回完整的2MB写入字节数,配合循环处理剩余数据后,浏览器可成功接收全部内容。
  • 使用SSL套接字时,每次调用始终返回写入16384字节(即SSL最大记录大小),同时返回错误码WOULD_BLOCK;即便按逻辑循环写入剩余数据,仍会出现异常。切换为阻塞模式或在每次写入操作间添加100ms线程休眠则可正常工作。

核心疑惑

  1. 为何返回WOULD_BLOCK错误时仍固定写入16384字节?按预期,阻塞状态下写入字节数应更少甚至为0。
  2. 过早发起写入会导致本地和远程均出错,且非阻塞模式下无法得知返回WOULD_BLOCK后何时可再次写入,似乎ASIO的SSL套接字无法在非阻塞模式下正常使用。

问题根源

该函数从OpenSSL缓冲区读取加密数据并通过常规ASIO写入操作传输。问题在于未检查该函数的返回值,实际发送的数据量可能小于要求的16KB,但应用会被告知write_some已发送16+K字节。这会导致双方SSL状态不同步:发送方认为已发送16KB,但接收方仅收到比如4KB,其余数据丢失。应用后续发送会跳过16KB,多次操作后OpenSSL检测到错误状态,报告错误并由ASIO关闭套接字。

内容的提问来源于stack exchange,提问作者Zebrafish

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 18:21:08