如何在C服务器中同步HTTP请求

时间:2019-12-08 09:33:01

标签: c sockets http

我正在尝试使用线程在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标头,但这不会阻止服务器像新客户端一样接受请求,并且如果有解决方法,您如何知道何时应该停止阅读来自保持活动的请求?

0 个答案:

没有答案
相关问题