尝试在C中实现mini-http持久服务器

时间:2019-03-07 21:15:58

标签: c http

我正在尝试建立一个每次仅具有一个连接的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秒钟内套接字什么都没有,我就关闭连接。

好吧。这根本不起作用。它造成了很多孩子,我不知道为什么。帮助将不胜感激!

0 个答案:

没有答案