gpt4 book ai didi

c++ - C++中套接字的HTTP请求

转载 作者:太空宇宙 更新时间:2023-11-04 16:20:14 26 4
gpt4 key购买 nike

我在使用 C++ 套接字 (Linux) 创建的 HTTP 请求时遇到了一个问题。我需要从 API 获取一些信息。

#include <iostream>
#include <ctype.h>
#include <cstring>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>
#include <netinet/in.h>
#include <unistd.h>
#include <sstream>
#include <fstream>
#include <string>

using namespace std;

int sock;
struct sockaddr_in client;
int PORT = 80;

int main(int argc, char const *argv[])
{
struct hostent * host = gethostbyname("api.themoviedb.org");

if ( (host == NULL) || (host->h_addr == NULL) ) {
cout << "Error retrieving DNS information." << endl;
exit(1);
}

bzero(&client, sizeof(client));
client.sin_family = AF_INET;
client.sin_port = htons( PORT );
memcpy(&client.sin_addr, host->h_addr, host->h_length);

sock = socket(AF_INET, SOCK_STREAM, 0);

if (sock < 0) {
cout << "Error creating socket." << endl;
exit(1);
}

if ( connect(sock, (struct sockaddr *)&client, sizeof(client)) < 0 ) {
close(sock);
cout << "Could not connect" << endl;
exit(1);
}

stringstream ss;
ss << "GET /3/movie/" << 550 << "?api_key=xxx HTTP/1.1\r\n"
<< "Host: api.themoviedb.org\r\n"
<< "Accept: application/json\r\n"
<< "\r\n\r\n";
string request = ss.str();

if (send(sock, request.c_str(), request.length(), 0) != (int)request.length()) {
cout << "Error sending request." << endl;
exit(1);
}

char cur;
while ( read(sock, &cur, 1) > 0 ) {
cout << cur;
}

return 0;
}

但问题是时间太长了。它开始向控制台写入响应,但在 9/10 结束,并且需要大约 30 秒才能结束。当我试图改变循环时:

cout << cur;

收件人:

cout << cur << endl;

然后它会写入一个完整的结果,但之后程序会滞后一段时间。这段代码有什么问题?当我尝试通过终端的经典 curl 获得响应时,一切正常。感谢您的帮助

最佳答案

Web 服务器可能正在保持连接打开,等待您的下一个 HTTP 请求,但它永远不会到来。服务器最终超时并关闭连接。您可以通过以下任一方式更改此行为:

  1. 使用请求中的 Connection: close 标题行请求服务器关闭连接

  2. 解析响应 header ,了解响应结束后何时停止阅读。参见 RFC 2616 Section 4.4有关如何检测响应结束的规则。

关于c++ - C++中套接字的HTTP请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17685466/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com