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

WinSock 網路程式設計完整流程指南:從初始化到收發數據

     編輯:關於C語言

Windows 平台下的網路程式開發核心是 WinSock API。本文梳理標準開發流程:庫載入、Socket 建立、綁定/監聽/接受 (Server)、連接 (Client)、收發數據、清理,並附上關鍵函數簽名、參數說明與典型代碼片段。

0. 關鍵工具函數:位元組序轉換

u_short htons(u_short);  // 主機序 → 網路序 (短整數)
u_long  htonl(u_long);   // 主機序 → 網路序 (長整數)
u_short ntohs(u_short);  // 網路序 → 主機序
u_long  ntohl(u_long);

Intel x86 為小端序,網路標準為大端序,**跨機器通訊必須轉換**,否則數據解析錯誤。

1. WinSock 庫初始化與清理

#pragma comment(lib, "ws2_32.lib")  // 連結庫
WSADATA wsaData;
WSAStartup(MAKEWORD(2,2), &wsaData); // 請求 2.2 版本
// ... 使用 WinSock API ...
WSACleanup(); // 釋放庫資源,與 WSAStartup 成對

若 `WSAStartup` 失敗,調用 `WSAGetLastError()` 取得錯誤碼。

2. Socket 建立與關閉

SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // TCP
// SOCK_DGRAM + IPPROTO_UDP 為 UDP
// 失敗返回 INVALID_SOCKET
closesocket(s); // 關閉,成功返回 0

3. 伺服器端:綁定、監聽、接受

// 綁定本地 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 繼續監聽

4. 客戶端:連接伺服器

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));

5. 數據收發 (TCP 流式)

// 發送
send(s, buf, len, 0); // 返回實際發送位元組數,可能 < len 需循環發送

// 接收
recv(s, buf, len, 0); // 返回實際接收位元組數,0 表對方關閉,-1 表錯誤

**阻塞模式** (預設):`send` 等待緩衝區可寫;`recv` 等待數據到達。非阻塞模式需 `ioctlsocket(FIONBIO)` 配合 `select`/`WSAAsyncSelect`。

6. 完整流程圖

WinSock 程式流程圖

常見坑點提醒

  • 忘記 `WSAStartup` / `WSACleanup` 成對調用。
  • 端口號、IP 地址未用 `htons`/`htonl`/`inet_pton` 轉換網路序。
  • `accept` 返回的新 Socket 才是通訊用,原 Socket 繼續 `listen`。
  • `send`/`recv` 返回值未檢查,導致部分發送/接收被忽略。
  • 缺乏錯誤處理:每個 API 失敗必須檢查 `WSAGetLastError()`。

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

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved