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

Windows Socket API 實戰經驗總結:WSAStartup、socket、連線與資料收發關鍵點

     編輯:VC 教學

1. WSAStartup:版本協商與載入


WORD wVersionRequested = MAKEWORD(2, 1); // 請求 2.1 版
WSADATA wsaData;
int err = WSAStartup(wVersionRequested, &wsaData);
// 成功返回 0,wsaData 載入實際版本資訊

必須在第一個 Socket 呼叫前執行,進程可多次呼叫(需對應 `WSACleanup`)。

2. WSACleanup:釋放綁定資源

程式結束前呼叫,解除與 Winsock DLL 綁定、釋放資源。

3. socket:建立通訊端點


SOCKET s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP); // TCP 流式
// SOCK_DGRAM 為 UDP 資料報
// 成功返回描述符,失敗返回 INVALID_SOCKET

描述符為進程內索引,對應核心 Socket 物件。

4. 連線與收發關鍵經驗

  • 非阻塞模式:`ioctlsocket(s, FIONBIO, &on)` + `select()` 實現多路複用,避免 UI 凍結。
  • 封包邊界:TCP 為串流,應用層必須自行定義協議(長度前綴、分隔符)處理黏包/拆包。
  • 錯誤碼:`WSAGetLastError()` 取得擴展錯誤碼(如 `WSAEWOULDBLOCK`、`WSAECONNRESET`)。
  • 優雅關閉:`shutdown(s, SD_SEND)` → 循環 `recv` 至 0 → `closesocket(s)`。
  • 緩衝區大小:`SO_RCVBUF`/`SO_SNDBUF` 影響吞吐量,大檔案傳輸建議調大至 64KB+。

5. 實務建議

  1. 封裝 Socket 類別,RAII 管理描述符生命週期。
  2. 使用 `WSAEventSelect` 或完成端口 (IOCP) 提升高併發效能。
  3. 記錄完整連線狀態機,便於除錯異常斷線。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved