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线程休眠则可正常工作。
核心疑惑
- 为何返回
WOULD_BLOCK错误时仍固定写入16384字节?按预期,阻塞状态下写入字节数应更少甚至为0。 - 过早发起写入会导致本地和远程均出错,且非阻塞模式下无法得知返回
WOULD_BLOCK后何时可再次写入,似乎ASIO的SSL套接字无法在非阻塞模式下正常使用。
问题根源
该函数从OpenSSL缓冲区读取加密数据并通过常规ASIO写入操作传输。问题在于未检查该函数的返回值,实际发送的数据量可能小于要求的16KB,但应用会被告知
write_some已发送16+K字节。这会导致双方SSL状态不同步:发送方认为已发送16KB,但接收方仅收到比如4KB,其余数据丢失。应用后续发送会跳过16KB,多次操作后OpenSSL检测到错误状态,报告错误并由ASIO关闭套接字。
内容的提问来源于stack exchange,提问作者Zebrafish
相关产品推荐
相关产品推荐

