首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Windows Sockets:阻塞模式與非阻塞模式深度解析

     編輯:關於C語言

本文為三篇核心技術文檔之一(其餘為 Windows Sockets:位元組順序、Windows Sockets:字串轉換),詳細闡述套接字阻塞機制。使用 CAsyncSocket 需自行管理;使用 CSocket 則由 MFC 自動處理。

阻塞與非阻塞模式對比

模式行為特徵適用場景
阻塞(同步)函式直到操作完成才返回,執行緒被阻塞簡單邏輯、獨立執行緒、CSocket 內部管理
非阻塞(異步)函式立即返回,若無法完成則回傳 WSAEWOULDBLOCK單執行緒事件驅動、CAsyncSocket 預設模式

CSocket 永不返回 WSAEWOULDBLOCK,框架內部以訊息抽取機制管理阻塞,開發者無感知。

32 位與 16 位作業系統的差異

  • 32 位系統(Win95/98/NT):支援搶佔式多工與多執行緒。可將套接字放入獨立輔助執行緒,阻塞不影響主 UI 執行緒,且不佔用 CPU 時間片。參閱「多執行緒程式設計」。
  • 16 位系統(Win 3.1):無真正多執行緒,必須使用非阻塞模式配合回調通知(OnReceive 等)實作異步邏輯。
多執行緒應用建議: 主執行緒處理 UI 互動,輔助執行緒運行 CSocket 阻塞操作,邏輯分離簡潔。單執行緒應用則需用 CAsyncSocket 異步模式,或重寫 CSocket::OnMessagePending 在長時間同步操作中處理使用者操作。

16 位系統開發者指引(歷史參考)

  • 使用 CAsyncSocket 時避免阻塞呼叫,採異步模式:呼叫 Receive → 收到 WSAEWOULDBLOCK → 等待 OnReceive 通知 → 再次讀取。
  • Windows 平台視阻塞調用為不良實踐,CAsyncSocket 預設異步,需自行管理回調;CSocket 為同步封裝,抽取訊息管理阻塞。

相關規格與參考

  • Windows Sockets 規格文件(阻塞章節)
  • Windows Sockets:套接字通知
  • Windows Sockets:從套接字類別衍生
  • Windows Sockets:使用 CAsyncSocket 類別
  • Windows Sockets:使用帶存檔的套接字
  • Windows Sockets:背景知識
  • Windows Sockets:流式套接字
  • Windows Sockets:資料報套接字
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved