本文為三篇核心技術文檔之一(其餘為 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:資料報套接字