2016-05-30 30 views
1

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

当我尝试使用BIO_read(bio, buffer, sizeof(buff))作为http响应 - 在缓冲区中,我只获得一些响应,而不是全部响应。

如果有可能显示快满了响应的示例,请

回答

2

是否有可能使用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响应并获得预期的长度。上面的代码主要起作用,因为服务器关闭了连接,并且作为可用于完全接收响应的带外信号。

+0

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