2016-12-10 68 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

您的內容長度是否包含您的'resp_data'或僅'response_body'中的最終'\ r \ n'? –

+0

@SteffenUllrich不,它沒有,我改變了它。它現在似乎按預期工作。謝謝! – LuckyLuciano

回答

0

看來我的問題是我在計算內容長度時沒有包含最終的「\ r \ n」。它似乎正在工作!