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

Windows Sockets (WinSock) 網路程式設計入門:架構、Socket 類型與客戶端/伺服器模型

     編輯:關於C語言

WinSock 是 Windows 平台網路程式設計的標準 API,基於 Berkeley Socket 擴充而來,支援多種協定族(以 TCP/IP 為主)。本文介紹 WinSock 架構分層、Socket 類型(串流/資料報)、通訊域、客戶端/伺服器模型、廣播機制與位元組序處理,為後續 API 實作奠基。

WinSock 架構分層

應用程式
    │  調用 WinSock API (socket, bind, connect, send, recv...)
    ▼
WinSock DLL (ws2_32.dll)  ← 統一介面,轉發至特定協定供應商
    │
    ▼
協定供應商 (TCP/IP, IPX/SPX, AppleTalk...)
    │
    ▼
網路驅動程式 / NDIS
    │
    ▼
實體網路硬體

應用程式只需連結 `ws2_32.lib`,即可在任何安裝相容 WinSock 供應商的系統上執行。

Socket 類型

類型協定範例特性
串流 Socket (SOCK_STREAM)TCP連線導向、可靠、雙向、有序、無記錄邊界、流量控制
資料報 Socket (SOCK_DGRAM)UDP無連線、不可靠、無序、可能重複、保留記錄邊界、支援廣播

通訊域

WinSock 1.1 僅支援 Internet 域 (AF_INET),使用 TCP/IP 協定族。WinSock 2 擴充支援其他域(如 `AF_IPX`、`AF_APPLETALK`)。

客戶端/伺服器模型

  • 伺服器:`socket()` → `bind()` 知名埠號 → `listen()` → `accept()` 等待連線 → 處理請求 → `closesocket()`
  • 客戶端:`socket()` → `connect()` 連線伺服器 IP:Port → `send()`/`recv()` 交換資料 → `closesocket()`

協定可對稱(如 TELNET,雙方均可發起)或非對稱(如 FTP,客戶端發起控制連線,伺服器建立資料連線)。

廣播機制

  • 僅資料報 Socket 支援廣播
  • 需 `setsockopt(s, SOL_SOCKET, SO_BROADCAST, ...)` 啟用
  • 目的位址:`INADDR_BROADCAST` (255.255.255.255) 或子網廣播位址
  • 用途:資源探索(如 DHCP)、路由資訊交換
  • 廣播會造成網路負載,謹慎使用

位元組序 (Endianness)

  • Intel x86 為 Little-Endian(低位在前)
  • 網路標準為 Big-Endian(高位在前)
  • 轉換函數:
    `htons()`/`htonl()`:主機序 → 網路序 (Short/Long)
    `ntohs()`/`ntohl()`:網路序 → 主機序
  • 所有透過網路傳輸的整數(Port、IP、長度欄位)必須轉換

初始化與清理


WSADATA wsaData;
if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) { /* 錯誤處理 */ }
// ... 使用 socket API ...
WSACleanup();

`MAKEWORD(2,2)` 要求 WinSock 2.2 版。檢查 `wsaData.wVersion` 確認實際版本。

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