首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Socket 程式設計筆記(一):Unix vs Windows Socket 核心差異與 Winsock 進階模型

     編輯:關於C語言

Windows Socket 初始化與清理

與 Unix 最大差異在於進程級別的庫初始化:


// 程式啟動時
WSAData wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData); // 要求 2.2 版本

// 程式結束時
WSACleanup(); // 釋放 Winsock 資源
  • wVersion:請求版本(高位組主版本,低位組次版本)
  • lpWSAData:輸出結構,包含實際支援版本、廠商資訊、最大 Socket 數等
  • 關鍵規則:WSACleanup 後不可再呼叫任何 Socket API

Winsock 三種 I/O 模型深度比較

2.2.1 非阻塞 + select 模型(Unix 風格)


ioctlsocket(sock, FIONBIO, &nonBlocking); // 設為非阻塞
select(maxFd+1, &readSet, &writeSet, &exceptSet, &timeout);
  • 優點:跨平台、單執行緒管理多連線
  • 缺點:select 最大連線數受限(FD_SETSIZE 通常 1024)、需輪詢所有 fd

2.2.2 WSAAsyncSelect 視窗訊息模型


WSAAsyncSelect(sock, hwnd, WM_SOCKET, FD_READ | FD_CLOSE);
  • 事件驅動,無需輪詢
  • 訊息投遞至指定視窗程序
  • 事件類型:FD_ACCEPT, FD_CONNECT, FD_READ, FD_WRITE, FD_CLOSE, FD_OOB 等
  • 侷限:需視窗控制代碼(HWND),不適用服務類應用

2.2.3 WSAEventSelect 事件物件模型


WSAEventSelect(sock, hEvent, FD_READ | FD_WRITE);
// 配合 WSAEnumNetworkEvents() 取得具體事件
WaitForSingleObject(hEvent, INFINITE);
  • 無需視窗控制代碼,適用 Windows 服務、精靈程式
  • 使用核心事件物件同步,效率更高
  • 支援 WSAWaitForMultipleEvents 等待多個 Socket

事件類型完整對照表

事件觸發條件
FD_ACCEPT新連線請求到達
FD_CONNECT連線完成(客戶端)
FD_READ接收緩衝區有資料
FD_WRITE發送緩衝區可寫
FD_CLOSE連線關閉
FD_OOB帶外資料到達
FD_QOS服務品質變更

模型選擇指南

  • GUI 應用:WSAAsyncSelect 整合訊息迴圈最自然
  • 高效能服務:WSAEventSelect + IOCP(完成埠)為最佳組合
  • 跨平台移植:非阻塞 + select/poll/epoll
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved