Linux下TCP socket编程accept()报bad file descriptor错误咨询
错误根因
你的服务端代码在fork()创建子进程后,父进程的逻辑出现致命错误:
- 父进程错误关闭了监听套接字
listen_fd,仅子进程需要关闭监听套接字(子进程不需要处理新连接申请) - 父进程未关闭不需要的已连接套接字
connect_fd,会造成文件描述符泄漏
第一次客户端连接到来时,accept()正常返回连接套接字,fork()后子进程正常处理客户端请求,所以客户端能正常拿到返回结果。但父进程直接关闭了listen_fd,下一次循环执行accept()时,传入的listen_fd已经是被关闭的无效文件描述符,就会抛出Bad file descriptor错误导致服务端崩溃。
修复方法
修改服务端fork()后的父进程分支逻辑:
原错误代码:
} else close(listen_fd);
修改为:
} else { // 父进程不需要处理已连接的客户端,关闭连接套接字 close(connect_fd); // 父进程保留监听套接字,用于接收后续新连接,不得关闭listen_fd }
其他可选优化点
- 端口调整:当前绑定的1024端口属于系统保留端口,需要root权限才能绑定,建议修改为1024以上的未占用端口(例如8080)
- 退出判断修复:
fgets读取的输入会自带末尾的换行符,现有逻辑strcmp(buffer_str, "exit") == 0永远不会触发,建议改为strcmp(buffer_str, "exit\n") == 0,或者先去掉字符串末尾的换行符再做判断 - 传输优化:
write操作当前每次写入整个1024字节的缓冲区,存在大量无效数据传输,建议改为写入字符串实际长度:write(connect_fd, buffer_str, strlen(buffer_str))
内容的提问来源于stack exchange,提问作者user13557576
相关产品推荐
相关产品推荐

