Windows 平台下的網路程式開發核心是 WinSock API。本文梳理標準開發流程:庫載入、Socket 建立、綁定/監聽/接受 (Server)、連接 (Client)、收發數據、清理,並附上關鍵函數簽名、參數說明與典型代碼片段。
u_short htons(u_short); // 主機序 → 網路序 (短整數) u_long htonl(u_long); // 主機序 → 網路序 (長整數) u_short ntohs(u_short); // 網路序 → 主機序 u_long ntohl(u_long);
Intel x86 為小端序,網路標準為大端序,**跨機器通訊必須轉換**,否則數據解析錯誤。
#pragma comment(lib, "ws2_32.lib") // 連結庫 WSADATA wsaData; WSAStartup(MAKEWORD(2,2), &wsaData); // 請求 2.2 版本 // ... 使用 WinSock API ... WSACleanup(); // 釋放庫資源,與 WSAStartup 成對
若 `WSAStartup` 失敗,調用 `WSAGetLastError()` 取得錯誤碼。
SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // TCP // SOCK_DGRAM + IPPROTO_UDP 為 UDP // 失敗返回 INVALID_SOCKET closesocket(s); // 關閉,成功返回 0
// 綁定本地 IP:Port
sockaddr_in sin = {0};
sin.sin_family = AF_INET;
sin.sin_port = htons(8888);
sin.sin_addr.s_addr = INADDR_ANY; // 自動綁定所有介面
bind(s, (sockaddr*)&sin, sizeof(sin));
// 進入監聽狀態
listen(s, SOMAXCONN); // backlog 設最大
// 接受客戶端連接 (阻塞)
sockaddr_in clientAddr;
int addrLen = sizeof(clientAddr);
SOCKET clientSock = accept(s, (sockaddr*)&clientAddr, &addrLen);
// clientSock 用於與該客戶端通訊,原 s 繼續監聽
sockaddr_in srv = {0};
srv.sin_family = AF_INET;
srv.sin_port = htons(8888);
inet_pton(AF_INET, "127.0.0.1", &srv.sin_addr); // 或 gethostbyname
connect(s, (sockaddr*)&srv, sizeof(srv));
// 發送 send(s, buf, len, 0); // 返回實際發送位元組數,可能 < len 需循環發送 // 接收 recv(s, buf, len, 0); // 返回實際接收位元組數,0 表對方關閉,-1 表錯誤
**阻塞模式** (預設):`send` 等待緩衝區可寫;`recv` 等待數據到達。非阻塞模式需 `ioctlsocket(FIONBIO)` 配合 `select`/`WSAAsyncSelect`。

掌握此流程,即可編寫健壯的 Windows TCP/UDP 客戶端/伺服器程式。進階主題:I/O 完成埠 (IOCP)、重疊 I/O、SSL/TLS 加密、跨平台封裝 (Boost.Asio、libuv)。