我第一次尝试使用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流的末尾,我想知道它。
如果有人能帮助我,我会很感激!
答案 0 :(得分:1)
正确的行为是在HTTP响应数据告诉您停止读取时停止读取。首先读取响应头(读取直到达到\r\n\r\n
),然后解析头部,然后按头部的指示读取响应主体的其余部分,并仅在到达响应结束时停止读取由标题决定,或者当服务器关闭连接时,无论哪个首先遇到。 - 雷米·勒博(Remy Lebeau)