是否可以使用BIO_read(C++)从服务器获取HTTP响应?使用BIO_read时的部分HTTP响应
当我尝试使用BIO_read(bio, buffer, sizeof(buff))
作为http响应 - 在缓冲区中,我只获得一些响应,而不是全部响应。
如果有可能显示快满了响应的示例,请
是否可以使用BIO_read(C++)从服务器获取HTTP响应?使用BIO_read时的部分HTTP响应
当我尝试使用BIO_read(bio, buffer, sizeof(buff))
作为http响应 - 在缓冲区中,我只获得一些响应,而不是全部响应。
如果有可能显示快满了响应的示例,请
是否有可能使用BIO_READ
是从服务器获取的HTTP响应。
如果有可能显示快满了响应的示例,请
从SSL/TLS Client在OpenSS维基:
#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_should_retry
用于检测是否有更多的数据由于潜在的竞争而被读取。
其不是 a 完整示例。生产中应该发生的是您对BIO
进行了部分阅读。您可以确定响应头的响应长度。然后用安全阀添加第三个条件 - 预期响应长度。您需要一个安全阀来处理破损的Web服务器和错误的代理,这些代理会提供错误的响应时间。
如果您从HTTP请求中删除Connection: close
,那么您将需要解析HTTP响应并获得预期的长度。上面的代码主要起作用,因为服务器关闭了连接,并且作为可用于完全接收响应的带外信号。
我可以用Cout而不是BIO_write打印服务器答案吗? –