與 Unix 最大差異在於進程級別的庫初始化:
// 程式啟動時
WSAData wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData); // 要求 2.2 版本
// 程式結束時
WSACleanup(); // 釋放 Winsock 資源
wVersion:請求版本(高位組主版本,低位組次版本)lpWSAData:輸出結構,包含實際支援版本、廠商資訊、最大 Socket 數等WSACleanup 後不可再呼叫任何 Socket API
ioctlsocket(sock, FIONBIO, &nonBlocking); // 設為非阻塞
select(maxFd+1, &readSet, &writeSet, &exceptSet, &timeout);
select 最大連線數受限(FD_SETSIZE 通常 1024)、需輪詢所有 fd
WSAAsyncSelect(sock, hwnd, WM_SOCKET, FD_READ | FD_CLOSE);
FD_ACCEPT, FD_CONNECT, FD_READ, FD_WRITE, FD_CLOSE, FD_OOB 等HWND),不適用服務類應用
WSAEventSelect(sock, hEvent, FD_READ | FD_WRITE);
// 配合 WSAEnumNetworkEvents() 取得具體事件
WaitForSingleObject(hEvent, INFINITE);
WSAWaitForMultipleEvents 等待多個 Socket| 事件 | 觸發條件 |
|---|---|
| FD_ACCEPT | 新連線請求到達 |
| FD_CONNECT | 連線完成(客戶端) |
| FD_READ | 接收緩衝區有資料 |
| FD_WRITE | 發送緩衝區可寫 |
| FD_CLOSE | 連線關閉 |
| FD_OOB | 帶外資料到達 |
| FD_QOS | 服務品質變更 |
WSAAsyncSelect 整合訊息迴圈最自然WSAEventSelect + IOCP(完成埠)為最佳組合select/poll/epoll