本文彙整筆者在 Windows 與 HP-UX 雙平台網路程式開發的實戰經驗,聚焦 **同步阻塞模式** 下核心 Socket API 的行為細節、錯誤處理陷阱與最佳實踐,供開發者參考避坑。
WORD wVersion = MAKEWORD(2, 1); // 要求 2.1 版
WSADATA wsaData;
int err = WSAStartup(wVersion, &wsaData);
// 成功回傳 0,wsaData 輸出實際版本、廠商資訊、最大 Socket 數等
WSACleanup 釋放資源應用程式結束前呼叫,減少參考計數,歸零時卸載 DLL。
struct protoent *ppe = getprotobyname("tcp");
SOCKET s = socket(PF_INET, SOCK_STREAM, ppe->p_proto);
SOCKET_ERROR關鍵認知:send **只負責將使用者緩衝區資料複製至 Kernel 發送緩衝區**,而非傳送至網路。
SOCKET_ERRORWSAEWOULDBLOCKSOCKET_ERRORsend)SOCKET_ERROR (Windows) / 收到 SIGPIPE (Unix 預設終止進程)INADDR_ANY + htons(8888))connect 隱性綁定臨時 Portsockaddr_in 結構:sin_family=AF_INET, sin_port, sin_addr.s_addrSOCK_STREAMbacklog:未完成三向交握連線佇列上限 (系統限制)addr/addrlen 取得客戶端位址WSAEWOULDBLOCK,需用 select 監控寫就緒判斷完成| 場景 | Windows | Unix/Linux |
|---|---|---|
| send/recv 期間網路斷開 | 下一個 Socket API 回傳 SOCKET_ERROR | 進程收到 SIGPIPE,預設終止 |
| 非阻塞 connect | WSAEWOULDBLOCK + select 監控寫集合 | EINPROGRESS + select/poll 監控寫集合 |
| 關閉 Socket | closesocket | close |
WSAStartup 回傳值WSAGetLastError()WSAEWOULDBLOCK)shutdown(s, SD_SEND) → 循環 recv 至 0 → closesocket