C++ 使用BIO_读取时的部分HTTP响应

C++ 使用BIO_读取时的部分HTTP响应,c++,http,ssl,https,openssl,C++,Http,Ssl,Https,Openssl,是否可以使用BIO_read(C++)从服务器获取HTTP响应 当我尝试对http响应使用BIO_read(BIO,buffer,sizeof(buff))时,在缓冲区中我只得到部分响应,而不是全部响应 如果有可能,请展示一个获得完整响应的示例 是否可以使用BIO_read从服务器获取HTTP响应 对 如果有可能,请展示一个获得完整响应的示例 从OpenSS wiki上的: #define HOST_NAME "www.random.org" #define HOST_PORT "443" #

是否可以使用BIO_read(C++)从服务器获取HTTP响应

当我尝试对http响应使用
BIO_read(BIO,buffer,sizeof(buff))
时,在缓冲区中我只得到部分响应,而不是全部响应

如果有可能,请展示一个获得完整响应的示例

是否可以使用BIO_read从服务器获取HTTP响应


如果有可能,请展示一个获得完整响应的示例

从OpenSS wiki上的:

#define HOST_NAME "www.random.org"
#define HOST_PORT "443"
#define HOST_RESOURCE "/cgi-bin/randbyte?nbytes=32&format=h"
...

BIO *web = NULL, *out = NULL;
...

BIO_puts(web, "GET " HOST_RESOURCE " HTTP/1.1\r\n"
              "Host: " HOST_NAME "\r\n"
              "Connection: close\r\n\r\n");
BIO_puts(out, "\n");
...

int len = 0;
do
{
  char buff[1536] = {};
  len = BIO_read(web, buff, sizeof(buff));

  if(len > 0)
    BIO_write(out, buff, len);

} while (len > 0 || BIO_should_retry(web));
你应该注意两件事。首先,检查
BIO_read
的返回值。其次,
BIO\u should\u retry
用于检测是否由于潜在的竞争而有更多的数据需要读取

这不是一个完整的例子。在生产过程中,应该对
BIO
执行部分读取。您可以从响应头确定响应的长度。然后添加第三个条件和安全阀-预期响应长度。对于提供错误响应长度的坏web服务器和坏代理,您需要一个安全阀


如果从HTTP请求中删除
连接:close
,则需要解析HTTP响应并获得预期长度。上面的代码之所以有效,主要是因为服务器关闭了连接,这是一个带外信号,您可以使用它来完全接收响应。

我可以用Cout而不是BIO_write打印服务器答案吗?