gpt4 book ai didi

ssl - OpenSSL SSL_ERROR_WANT_WRITE 在 SSL_write() 期间永远不会恢复

转载 作者:太空宇宙 更新时间:2023-11-03 12:56:20 28 4
gpt4 key购买 nike

我有两个应用程序通过 SSL 相互通信。客户端在 windows 机器上运行,服务器是基于 linux 的应用程序。客户端在启动时向服务器发送大量数据。数据以约 4000 字节的 block 发送到包含 30 个条目的服务器。我必须发送大约 50000 个条目。

在传输过程中,服务器向客户端发送消息,消息大小约为 4000 字节。发生这种情况后,客户端的 SSL_write() 开始返回 SSL_ERROR_WANT_WRITE 错误。客户端休眠 10 毫秒,并使用完全相同的参数重试 SSL_write,但是,SSL_write 无限失败。随后它中止。如果它尝试发送新消息,我会收到一条错误消息,表明我没有发送之前发送的相同中止消息。

错误:1409F07F:SSL 例程:SSL3_WRITE_PENDING:错误写入重试”

服务器最终终止连接,因为它在 60 秒内没有收到客户端的消息并重新建立一个新连接。这仅供引用,真正的问题是如何恢复 SSL_write。

如果服务器在接收期间不发送请求,问题就会消失。如果我将请求的大小从 16K 缩小到 100 字节,问题就不会发生。

SSL CTX MODE 设置为 SSL_MODE_AUTO_RETRY 和 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER。

有没有人知道什么可能导致双方同时传输大量信息会导致这种失败。如果这是一个限制,而不是限制从服务器到客户端的大小,我能做些什么来防止它。我担心的是,如果客户端没有发送任何内容,我为避免此问题而应用的限制就是一种浪费。

在客户端,我尝试执行 SSL_read 以查看是否需要在写入期间读取,即使我从未收到 SSL_ERROR_PENDING_READ,但缓冲区也不是那么大。大小约为 1000 字节。

如有任何见解,我们将不胜感激。

最佳答案

SSL_ERROR_WANT_WRITE - 仅当套接字发送给它 EWOULDBLOCK 或 EAGAIN 错误时,OpenSSL(我假设您正在使用 OpenSSL)才会返回此错误。当发送端缓冲区已满时,套接字发送将给出 EWOUDLBLOCK 错误,这反过来意味着您的服务器没有读取从客户端发送的消息。

因此,从本质上讲,问题出在您的服务器上,它没有读取发送给它的消息。您需要检查您的服务器并修复它,这将自动修复您的客户端问题。

此外,为什么要设置“SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER”选项? SSL 总是期望它尝试发送的记录应该在发送下一条记录之前完全发送。

关于ssl - OpenSSL SSL_ERROR_WANT_WRITE 在 SSL_write() 期间永远不会恢复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13751458/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com