是否可以使用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打印服務器答案嗎? –