2016-12-10 2 views
0

У меня есть этот код, который обрабатывает некоторые очень простые HTTP-запросы. Я хочу, чтобы он поддерживал постоянные соединения. Если я запрашиваю некоторые страницы через firefox, сеанс/соединение повторно используются как запрошенные. Однако Chrome закрывает соединение после каждого запроса/ответа независимо от того, включен ли заголовок Connection: keep-alive или нет.Chrome закрывает TCP-соединение после ответа

Является ли это целью или является мой цикл чтения/записи неправильным?

#include<sys/socket.h> 

// some setup code 

listen(sockfd, 5); 

// accept new connections 
while (true) { 
    int session_sock_fd = accept(sockfd, (struct sockaddr*)&cli_addr, &clilen); 
    if (newsockfd < 0) { 
    // error 
    } else { 
    // create session 
    } 

// session main loop, each session runs in its own thread 
while(true) { 
    int n = read(session_sock_fd, buffer, buffer_size); 
    if (n < 0) { 
    // connection time out or some error 
    break; 
    } else if (n == 0) { 
    break; // client has closed the conneciton 
    } 

    // parse the request 

    // send response 
    char* resp_data = "HTTP/1.1 200 OK\r\nConnection: keep-alive\r\n" 
        "Content-Length: xxx\r\nDate: some date\r\n\r\n" 
        "response_body\r\n"; 
    n = write(session_sock_fd, resp_data, size); 
    if (n < 0) { 
    // error, unable to write to socket 
    break; 
    } 
} 
+1

Включает ли ваша длина контента окончательный '\ r \ n' в' resp_data' или только 'response_body'? –

+0

@SteffenUllrich Нет, это не так, я изменил его. Кажется, он работает так, как предполагалось. Спасибо! – LuckyLuciano

ответ

0

Похоже, моя проблема заключалась в том, что я не включал окончательный «\ r \ n», когда рассчитывал длину контента. Кажется, сейчас работает!

Смежные вопросы