Попытка реализовать постоянный мини-http сервер в C - PullRequest
2 голосов
/ 08 марта 2019

Я пытаюсь создать http-постоянный сервер только с одним соединением каждый раз.Когда я пытаюсь настроить сервер, все работает нормально.Проблема возникает в фазе accept .

Программа начинает создавать демона и ожидать соединения с bind .Эта часть прекрасно работает до этого:

    ...declarations...
    fd_set rfds;
    struct timeval tv;
    int retval;

    tv.tv_sec = 5;      
    tv.tv_usec = 0;

    while(1){

        length = sizeof(cli_addr);
        if((socketfd = accept(listenfd, (struct sockaddr *)&cli_addr, &length)) < 0)
            debug(ERROR,"system call","accept",0);


        int end=0;
        while(!end){

            FD_ZERO(&rfds);
            FD_SET(socketfd,&rfds);

            int is_something = select(socketfd+1,&rfds,NULL,NULL,&tv);


            if(is_something && FD_ISSET(socketfd, &rfds)){
                if((pid = fork()) < 0) debug(ERROR,"system call","fork",0);

                else {
                    if(pid == 0) { 
                        close(listenfd);
                        process_web_request(socketfd); //Let's assume this works fine
                        close(socketfd);
                        exit(1);
                    }           
                }
            }else{
                // We close the connection if timeout comes out
                debug(LOG,"Cierre de conexión","timeout",socketfd);
                (void)close(socketfd);  
                end=1;
            }   
        }
    }
}

Мне нужно подождать, пока в дескрипторе что-то есть с функцией select .Мои намерения таковы: если данные продолжают поступать из сокета, я продолжаю читать их и обрабатывать (в конечном итоге отправляя HTTP 200 OK и данные), но если через 5 секунд из сокета ничего не приходит, я закрываю соединение.

Хорошо.Это не работает вообще.Это создает много детей, и я не знаю почему.Помощь будет оценена!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...