首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Linux Socket 錯誤代碼 9 (EBADF) 含義及排查方法

     編輯:程式設計疑難解答

錯誤現象

Linux C 網絡編程中 sendto 返回 -1,errno = 9。

錯誤代碼含義

errno 9 對應 EBADF:Bad file descriptor(無效的文件描述符)。

常見原因

  • Socket 文件描述符未正確創建(socket() 失敗未檢查)
  • Socket 已被關閉(重複 close() 或邏輯錯誤提前關閉)
  • 傳遞給 sendto 的 socket 參數錯誤(如傳了 listen_sock 而非 conn_sock)
  • 多線程競態導致 FD 被其他線程關閉

快速排查方法

// 代碼中直接打印錯誤描述
#include <string.h>
#include <errno.h>

if (sendto(...) < 0) {
    fprintf(stderr, "sendto 失敗: %s (errno=%d)\n", strerror(errno), errno);
    // 輸出: sendto 失敗: Bad file descriptor (errno=9)
}

調試建議

  1. 檢查 socket() 返回值是否 > 0
  2. 用 strace -p 追蹤系統調用序列
  3. 添加日誌記錄 FD 創建、關閉、傳遞全過程
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved