接收recv数据,直到流结束(使用HTTP)

Receive recv data until end of stream (using HTTP)?

本文关键字:结束 使用 HTTP recv 数据 接收      更新时间:2023-10-16

这是我第一次尝试使用c++套接字,我遇到了第一个障碍。我使用send函数(GET / HTTP/1.1rnrn)向谷歌发送了一些数据,现在我正试图收到响应。我当前的代码:

char buffer[256];
std::string result = "";
int resultSize = 0;
bool receive = true;
while (receive) {
    resultSize = recv(dataSocket, buffer, sizeof(buffer) - 1, 0);
    buffer[resultSize] = ''; // Add NULL terminating character to complete string
    result += buffer;
    for (int i = 0; i < resultSize; i++) {
        if (buffer[i] == '') {
            receive = false;
        }
    }
}
return result;

使用256大小的缓冲区来演示这个问题,即如果页面包含的字节比我在缓冲区中接收的字节多,那么第一次尝试时它不会接收到所有内容。我试过循环,直到数据包含一个空终止符(''),这似乎不起作用。我也试着检查空行('rn'),这并不奏效,因为有一个页的标题和HTML内容之间的空行。

我注意到的是,我可以使用Content-Length头来解决这个问题。然而,我不确定如何获得该标题,因为它需要至少一个接收调用,如果有一个好的,安全和有效的方法来做到这一点。当响应不包括Content-Length头时,我也不确定该怎么办,因为程序将陷入无限循环。

因此,如果有一种方法允许我重复recv,直到到达HTTP流的末尾,我想知道它。

如果有人能帮我,我会很感激的!

正确的行为是当HTTP响应数据告诉您停止阅读时停止阅读。首先读取响应报头(读取到rnrn为止),然后解析报头,然后按照报头的指示读取响应体的其余部分,只有在到达报头所指示的响应结束时或服务器关闭连接时(以先遇到的情况为准)才停止读取。-人头马·勒博