У меня есть этот код, который обрабатывает некоторые очень простые 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;
}
}
Включает ли ваша длина контента окончательный '\ r \ n' в' resp_data' или только 'response_body'? –
@SteffenUllrich Нет, это не так, я изменил его. Кажется, он работает так, как предполагалось. Спасибо! – LuckyLuciano