1. WSAStartup:版本協商與載入
WORD wVersionRequested = MAKEWORD(2, 1); // 請求 2.1 版
WSADATA wsaData;
int err = WSAStartup(wVersionRequested, &wsaData);
// 成功返回 0,wsaData 載入實際版本資訊
必須在第一個 Socket 呼叫前執行,進程可多次呼叫(需對應 `WSACleanup`)。
2. WSACleanup:釋放綁定資源
程式結束前呼叫,解除與 Winsock DLL 綁定、釋放資源。
3. socket:建立通訊端點
SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // TCP 流式
// SOCK_DGRAM 為 UDP 資料報
// 成功返回描述符,失敗返回 INVALID_SOCKET
描述符為進程內索引,對應核心 Socket 物件。
4. 連線與收發關鍵經驗
- 非阻塞模式:`ioctlsocket(s, FIONBIO, &on)` + `select()` 實現多路複用,避免 UI 凍結。
- 封包邊界:TCP 為串流,應用層必須自行定義協議(長度前綴、分隔符)處理黏包/拆包。
- 錯誤碼:`WSAGetLastError()` 取得擴展錯誤碼(如 `WSAEWOULDBLOCK`、`WSAECONNRESET`)。
- 優雅關閉:`shutdown(s, SD_SEND)` → 循環 `recv` 至 0 → `closesocket(s)`。
- 緩衝區大小:`SO_RCVBUF`/`SO_SNDBUF` 影響吞吐量,大檔案傳輸建議調大至 64KB+。
5. 實務建議
- 封裝 Socket 類別,RAII 管理描述符生命週期。
- 使用 `WSAEventSelect` 或完成端口 (IOCP) 提升高併發效能。
- 記錄完整連線狀態機,便於除錯異常斷線。