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

时间:2015-09-30 01:09:59

标签: c++ sockets http recv

我第一次尝试使用C ++套接字,而且我遇到了第一个障碍。我使用send函数(GET / HTTP/1.1\r\n\r\n)向google发送了一些数据,现在我正在尝试接收响应。我目前的代码:

char buffer[256];
std::string result = "";

int resultSize = 0;
bool receive = true;
while (receive) {
    resultSize = recv(dataSocket, buffer, sizeof(buffer) - 1, 0);
    buffer[resultSize] = '\0'; // Add NULL terminating character to complete string
    result += buffer;

    for (int i = 0; i < resultSize; i++) {
        if (buffer[i] == '\0') {
            receive = false;
        }
    }
}

return result;

使用256的缓冲区来演示问题,即如果页面包含的字节多于我在缓冲区中接收的字节数,则在第一次尝试时它不会收到所有内容。我已经尝试循环,直到数据包含空终止符('\0'),这似乎不起作用。我也尝试检查空行('\r\n'),由于页眉和页面的HTML内容之间有一个空行,因此无法正常工作。

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

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

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

1 个答案:

答案 0 :(得分:1)

正确的行为是在HTTP响应数据告诉您停止读取时停止读取。首先读取响应头(读取直到达到\r\n\r\n),然后解析头部,然后按头部的指示读取响应主体的其余部分,并仅在到达响应结束时停止读取由标题决定,或者当服务器关闭连接时,无论哪个首先遇到。 - 雷米·勒博(Remy Lebeau)