我正在尝试使用线程在C中构建HTTP服务器(每个请求都由线程处理)。这是接受客户并开始处理请求的主要部分。
while(1)
{
printf("\n+++++++ Waiting for new connection ++++++++\n\n");
if ((new_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen))<0)
{
perror("In accept");
exit(EXIT_FAILURE);
}
pthread_t thread;
//printf("%d\n", new_socket);
pthread_create(&thread, NULL, client, &new_socket);
//sleep(1);
}
这是客户端功能
void * client(void * socket){
char buffer[5000] = {0};
char responce[MAX_LEN] = {0};
char path[100] = {0};
long valread;
int new_socket = *((int *) socket);
if(valread = read(new_socket , buffer, MAX_LEN) < 0){
printf("%s\n", "Error reading from client...");
pthread_exit("crepat");
}else{
printf("%s\n",buffer);
if(strlen(buffer) > 10){
parse(buffer, path);
if(strstr(path,"favicon.ico")){
strcpy(responce, "HTTP/1.1 404 Not Found\r\n\r\n");
int writeError;
if(writeError = write (new_socket, responce, strlen(responce)) < 0)
printf("%s\n", "O Crepat aici la write wa");
close (new_socket);
}
else{
response_generator (new_socket, path);
/*This function generate the header and resp and send them to the client through socket*/
}
}
buffer[0] = '\0';
responce[0] = '\0';
path[0] = '\0';
}
}
我认为问题是由于大量请求,并且因为其中一些请求是大文件,例如图像和js,有时它们彼此冲突。我相信这是问题所在,因为如果我使用sleep(1)
函数(即使每个特定请求花费1秒),也可以正常工作,但是如果两次请求之间没有等待时间,则无限加载页面块,因为有些文件无法发送,客户端仍在等待它们。
我的问题是我如何按顺序保留请求,但同时又使服务器保持多线程,以便它可以处理来自不同客户端的多个请求?我首先想到的是使用Connection: keep-alive
标头,但这不会阻止服务器像新客户端一样接受请求,并且如果有解决方法,您如何知道何时应该停止阅读来自保持活动的请求?