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

Socket 程式設計中 accept() 返回 0 的原因:運算子優先級陷阱

     編輯:程式設計綜合問答

現象

Client connect() 成功,Server accept() 返回 0,導致後續邏輯失敗。

根本原因

C/C++ 中 = 賦值運算子優先級**低於** == 比較運算子。
錯誤寫法:

if (client_fd = accept(...) == -1) // 實際解析為 client_fd = (accept(...) == -1)
    // 錯誤處理

accept() 返回的 socket descriptor (非負整數) 與 -1 比較結果為 0 (false),此 0 被賦值給 client_fd,導致後續以為連線失敗或 socket 為 0 (stdin)。

正確寫法

if ((client_fd = accept(...)) == -1) // 加括號提升優先級
    // 錯誤處理

最佳實踐

  • **永遠給賦值比較加括號**:if ((fd = func()) == -1)。
  • 啟用編譯器警告 -Wparentheses (GCC/Clang) 或 /Wall (MSVC) 自動檢測。
  • 分行寫入更清晰:
    client_fd = accept(...);
    if (client_fd == -1) { ... }

總結

accept() 返回 0 是典型的 **運算子優先級錯誤**,加上括號或分行即可解決,養成良好編碼習慣可避免 90% 此類 Bug。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved