You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:24:02