簡體   English   中英

C ++中套接字的HTTP請求

[英]HTTP request by sockets in C++

我對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;

然后,它寫入一個完整的結果,但之后程序滯后一會兒。 此代碼有什么問題? 當我嘗試從終端獲得經典卷發的響應時,一切正常。 謝謝你的幫助

Web服務器可能正在打開連接,以等待您的下一個HTTP請求,該請求永遠不會發生。 服務器最終超時並關閉連接。 您可以通過以下任一方式更改此行為:

  1. 請求服務器使用Connection: close請求中的Connection: close標題行Connection: close連接

  2. 解析響應標頭,以了解在響應結束后何時停止讀取。 有關如何檢測響應結束的規則,請參見RFC 2616第4.4節

您可能已經使用HTTP / 1.0作為請求的版本,因為1.0版本確定服務器應在每個請求之后關閉連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM