gpt4 book ai didi

https - 为什么这个 SSL_pending 调用总是返回零?

转载 作者:行者123 更新时间:2023-12-04 11:14:22 24 4
gpt4 key购买 nike

此代码适用于使用阻塞套接字的 HTTPS 服务器:

  request := '';
start := gettickcount;
repeat
if SSL_pending(ssl) > 0 then
begin
bytesin := SSL_read(ssl, buffer, sizeof(buffer)-1);
if bytesin > 0 then
begin
buffer[bytesin] := #0;
request := request + buffer;
end
else break; // read failed
end; // pending
until (gettickcount - start) > LARGETIMEOUT;
// "request" is ready, though possibly empty

SSL_pending() 总是 返回零并且永远不会达到 SSL_read()。如果 SSL_pending() 调用被删除,则 SSL_read() 被执行。为什么 SSL_pending() 不指示有多少字节可用?

请注意,如果您调用 SSL_read() 并且返回的字节数小于您的缓冲区大小,那么您已经阅读了所有内容并完成了。

如果传入的数据大于您的缓冲区大小,则第一个 SSL_read() 调用会填充缓冲区,您可以重复调用 SSL_read() 直到无法填充缓冲区。

但是 如果传入的数据是缓冲区大小的精确倍数,则最后一 block 数据会填充缓冲区。如果您尝试另一个 SSL_read() 认为阻塞套接字上可能有更多数据,它会无限期挂起。因此希望首先检查 SSL_pending()。然而,这似乎不起作用。

如何避免卡在最终的 SSL_read() 上? (我无法想象答案是非阻塞的,因为这意味着您永远不能将 SSL_read 与阻塞一起使用。)

更新:以下作品。显然 SSL_pending() 在第一个 SSL_read() 之后才起作用:
  request := '';
repeat
bytesin := SSL_read(ssl, buffer, sizeof(buffer)-1);
if bytesin > 0 then
begin
buffer[bytesin] := #0;
request := request + buffer;
end
else break; // read failed
until SSL_pending(ssl) <= 0;
// "request" is ready, though possibly empty

最佳答案

您正在使用 SSL_pending()完全错误的方式。 OpenSSL 使用状态机,其中 SSL_pending()指示状态机是否有任何已缓冲并等待处理的未决字节。因为你从来没有调用 SSL_read() ,您永远不会缓冲任何数据或推进状态机。

关于https - 为什么这个 SSL_pending 调用总是返回零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6616976/

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