linux套接字cpp-recv()-无法通过http完全记录数据

linux sockets cpp recv() - cant recv fully data via http

本文关键字:http 数据 记录 cpp-recv 套接字 linux      更新时间:2024-09-23

我正在制作这个套接字HTTP客户端(非常基础(。当recv((从example.com中读取响应数据时,它运行良好,并将其全部写入缓冲区,但当我尝试重新生成任何更大的数据量时,它会停止在1500字节左右。

现在我所要做的就是将响应写入缓冲区(头等等(。没有试图解析任何内容。但这不起作用。它可以进行几次迭代,但随后会停止或挂起。我请求帮助识别导致这些行为的receive_response((函数的问题。

这是revc的HTTP响应的函数:

void tcp_client::receive_response(char *buffer) {
int bytes_recv = 0;
int total_bytes_recv = 0;
for (;;) {
bytes_recv = recv(sock, &buffer[total_bytes_recv], CHUNK_SIZE, 0);
if (bytes_recv <= 0) {
break;
} else {
total_bytes_recv += bytes_recv;
}
}
}

主要功能:

int main(int argc, char **argv) {
http_client http;
char response[100000] = {0};
http.connect_to_host("go.com", 80);
http.send_request("GET / HTTP/1.1rnrn");
http.receive_response(response);
std::cout << response << std::endl;
return 0;
}

谢谢

您似乎希望服务器在传输响应后关闭连接。默认情况下,典型的HTTP 1.1服务器不会执行此操作;除非客户端通过Connection: close报头明确提出其他请求,否则它们将保持连接打开以供进一步请求。

因此,您收到了所有的数据,然后下一个recv呼叫就在那里,等待更多的数据到达。

HTTP 1.1客户端期望通过Content-Length报头或通过解码chunked响应来检测响应的结束,如Transfer-Encoding: chunked报头所指示的。