在 accept 的时候一直报 Bad file descriptor 错

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <signal.h>
#include <string.h>
   
#define SERV_PORT 8031
  
int main(void)
{
    int lfd, cfd;
    struct sockaddr_in serv_addr,clin_addr;
    socklen_t clin_len;
    pid_t pid;
    char buf[1024];
    int len;
   
    if((lfd = socket(AF_INET,SOCK_STREAM,0)) == -1){
        perror("create socket failed");
        exit(1);
    }
 
    int opt = 1;
    setsockopt(lfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));
     
    memset(&serv_addr, 0, sizeof(serv_addr));
    serv_addr.sin_family = AF_INET;
    serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);
    serv_addr.sin_port = htons(SERV_PORT);
      
    if(bind(lfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) == -1)
    {
        perror("bind error");
        exit(1);
    }
       
    if(listen(lfd, 128) == -1)
    {
        perror("listen error");
        exit(1);
    }
  
    clin_len = sizeof(clin_addr);
 
    signal(SIGCLD,SIG_IGN);
 
    while(1)
    {
         
        if((cfd = accept(lfd, (struct sockaddr *)&clin_addr, &clin_len)) == -1)
        {
            perror("accept error");
            exit(1);
        }
 
        pid = fork();
 
        if (pid > 0)
        {
            // 在父进程中关闭连接的套接字描述符,只是把 cfd 的引用数减少1,在子进程中还在使用 cfd
            close(cfd);
        }
        else if (pid == 0)
        {
            // 子进程关闭 lfd 处理任务,使其回到 TIME_WAIT 状态值
            close(lfd);
 
            char web_result[] = "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\nContent-Length: 11\r\nServer: mengkang\r\n\r\nhello world";
            write(cfd,web_result,sizeof(web_result));
 
            close(cfd);
        }
        else
        {
            perror("fork error");
            exit(1);
        }
 
    }
  
    close(lfd);
      
    return 0;
}

上面代码运行起来之后,能对外提供服务,但是在服务器这边查看会有accept error: Bad file descriptor的错误信息,我wget了下,发现一次请求就一次报错,但是内容却是请求到了的。

阅读 12.6k
1 个回答

子进程关闭了lfd 而子进程没有退出 子进程中调用accept lfd已关闭了 然后accept就出错了。。

else if (pid == 0)
{

// 子进程关闭 lfd 处理任务,使其回到 TIME_WAIT 状态值
close(lfd);**

char web_result[] = "HTTP/1.1 200 OK\r\nContent-Type:text/html\r\nContent-Length: 11\r\nServer: mengkang\r\n\r\nhello world";
write(cfd,web_result,sizeof(web_result));

close(cfd);

}

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进