Я пытаюсь создать 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 секунд из сокета ничего не приходит, я закрываю соединение.
Хорошо.Это не работает вообще.Это создает много детей, и я не знаю почему.Помощь будет оценена!