我正在尝试建立一个每次仅具有一个连接的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秒钟内套接字什么都没有,我就关闭连接。
好吧。这根本不起作用。它造成了很多孩子,我不知道为什么。帮助将不胜感激!