理解 Unix Socket 與 WinSock 的異同,有助於掌握跨平台網路程式設計本質。本文整理兩者核心 API 對照與流程差異。
網路檔案描述符,用戶透過中間描述符處理網路操作,不直接操作網卡。
PF_INET (IPv4)、PF_INET6、PF_UNIX (IPC) 等。SOCK_STREAM (TCP)、SOCK_DGRAM (UDP)、SOCK_RAW 等。int socket(int domain, int type, int protocol);
// 範例:TCP IPv4
int sock = socket(PF_INET, SOCK_STREAM, 0);
Server: Client:
socket() socket()
bind()
listen()
accept() <--- connect()
recv() <--- send()
send() ---> recv()
close() <--> close()
Server: Client:
socket() socket()
bind()
recvfrom() <-- sendto()
sendto() --> recvfrom()
close() <--> close()
int sock = socket(PF_INET, SOCK_STREAM, 0);
fcntl(sock, F_SETFL, O_NONBLOCK); // 設定非阻塞
// 或使用 select() 多工
整體模仿 Unix Socket,主要差異在初始化/清理與非同步機制。
Server: Client:
WSAStartup() WSAStartup()
WSASocket() WSASocket()
bind()
listen()
WSAAccept() <-- WSAConnect()
WSARecv() <-- WSASend()
WSASend() --> WSARecv()
closesocket() <-> closesocket()
WSACleanup() WSACleanup()
MAKEWORD(2,2))。未呼叫 Cleanup 前不得再呼叫 Socket API。WSA:WSAAccept、WSARecv 等支援重疊 I/O 結構。| 模型 | 核心 API | 特點 |
|---|---|---|
| 非阻塞 + select | ioctlsocket(FIONBIO) + select() | 移植 Unix 碼最簡單 |
| WSAAsyncSelect | WSAAsyncSelect(s, hwnd, msg, events) | 視窗訊息驅動,需 UI 執行緒 |
| WSAEventSelect | WSAEventSelect(s, hEvent, events) | 事件物件驅動,適合服務/無 UI 程式 |