Linux socket read () не может правильно прочитать тело ответа - PullRequest
0 голосов
/ 27 мая 2018
int proxyRequest(string &request, char buffer[], struct hostent* host){
    int sockfd, sockopt;
    struct sockaddr_in their_addr;
    if((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1){
        perror("Socket generating failed");
        return -1;
    }
    if(host==NULL){
        strcpy(buffer, "HTTP/1.1 404 Not found\r\nContent-Type: text/html\r\n\r\n<h2>INET_E_RESOURCE_NOT_FOUND</h2>");
    }
    else{
        their_addr.sin_family = AF_INET;
        their_addr.sin_port = htons(SERVERPORT);
        their_addr.sin_addr.s_addr = ((struct in_addr*)host->h_addr_list[0])->s_addr;
        if(connect(sockfd, (struct sockaddr*)&their_addr, sizeof(their_addr)) == -1){
            perror("Connection failed");
            return -1;
        }
        write(sockfd, request.c_str(), request.length());
        read(sockfd, buffer, BUFSIZE);
        cout << buffer << endl;
    }
    close(sockfd);
    return 0;
}

Я делаю простой прокси-сервер, и все в порядке, за исключением того, что я не могу получить правильное тело resposne.

enter image description here

Этоэто запрос, который я отправляю на сервер (www.example.com).Это представляется как «запрос» в коде.

enter image description here

Кажется, что заголовки http получены правильно.Тем не менее, HTML-файл (тело) не отправляется вообще.И вместо этого есть странный персонаж.Почему это происходит?Это связано с нулевым символом?

1 Ответ

0 голосов
/ 27 мая 2018

Однако html-файл (тело) вообще не отправляется.И вместо этого есть странный персонаж.Почему это происходит?

Тело отправлено , но сжато.Следующее говорит вам, что контент сжимается с использованием алгоритма gzip:

Content-Encoding: gzip

Вам нужно будет либо распаковать его (заботясь о NUL-символах), либо сообщить серверу, что вы не готовыиметь дело с gzip закодированным контентом (т.е. удалить заголовок Accept-Encoding в вашем запросе).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...