accept、connect、send/recv、sendto/recvfrom、select、closesocket。bind、listen、getsockopt/setsockopt、getpeername/getsockname、位址轉換 htonl/ntohl 等。gethostbyname、getservbyname 等解析域名/服務/協定,預設阻塞,故提供異步版本 WSAAsyncGetHostByName 等。WSAAsyncSelect(事件驅動)、WSAIsBlocking、WSAGetLastError 等。| 模型 | 特徵 | 適用場景 |
|---|---|---|
| 阻塞 | 函式不返回直到完成;主執行緒訊息泵被凍結 | 簡單用戶端、獨立執行緒處理連線 |
| 非阻塞 | 立即返回,WSAEWOULDBLOCK 表示需等待 | 單執行緒多連線、GUI 應用程式 |
| 異步 (WSAAsyncSelect) | 指定視窗與訊息,事件發生時通知 | MFC 單執行緒 Socket 應用首選 |
| 重疊 I/O (Overlapped) | WSAEventSelect/WSASend + 完成埠 (IOCP) | 高效能伺服器、大量並發連線 |
WSAAsyncSelect 事件驅動模型詳解int WSAAsyncSelect(SOCKET s, HWND hWnd, u_int wMsg, long lEvent);
// lEvent 組合:FD_READ | FD_WRITE | FD_ACCEPT | FD_CONNECT | FD_CLOSE | FD_OOB
呼叫後,Socket 自動轉為非阻塞。指定事件發生時,Windows 送 wMsg 到 hWnd,wParam 為 Socket,lParam 低字為事件,高字為錯誤碼。
CSocket/CAsyncSocket 封裝CAsyncSocket:薄包裝,繼承可覆寫 OnReceive/OnAccept/OnConnect 等虛擬函式,內部使用 WSAAsyncSelect,適合單執行緒 GUI 應用。CSocket:繼承 CAsyncSocket,增加同步阻塞介面(Send/Receive 內部處理等待),並支援 CArchive 序列化,**但不支援多執行緒並發呼叫同一 Socket 物件**。AfxSocketInit 載入 Winsock DLL。CArchive 格式為 MFC 專有,跨語言/平台需自定協定(如 Protocol Buffers、JSON)。ShutDown(SD_SEND) 發送 FIN,等待 OnReceive 返回 0(對方也關閉)再 Close。