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

Socket 程式設計筆記 (1):Unix Socket 與 WinSock 基礎對照

     編輯:關於C#

前言

理解 Unix Socket 與 WinSock 的異同,有助於掌握跨平台網路程式設計本質。本文整理兩者核心 API 對照與流程差異。

Unix Socket 基礎

1. Socket 概念

網路檔案描述符,用戶透過中間描述符處理網路操作,不直接操作網卡。

2. 三要素

  • 通信域 (Domain):PF_INET (IPv4)、PF_INET6、PF_UNIX (IPC) 等。
  • 通信類型 (Type):SOCK_STREAM (TCP)、SOCK_DGRAM (UDP)、SOCK_RAW 等。
  • 協定 (Protocol):通常填 0 使用預設協定。

3. socket() 函數

int socket(int domain, int type, int protocol);
// 範例:TCP IPv4
int sock = socket(PF_INET, SOCK_STREAM, 0);

4. 面向連線流程 (TCP)

Server:          Client:
socket()         socket()
bind()
listen()
accept()  <---  connect()
recv()   <---  send()
send()   --->  recv()
close()  <-->  close()

5. 無連線流程 (UDP)

Server:          Client:
socket()         socket()
bind()
recvfrom() <-- sendto()
sendto()   --> recvfrom()
close()    <--> close()

6. 非阻塞 I/O

int sock = socket(PF_INET, SOCK_STREAM, 0);
fcntl(sock, F_SETFL, O_NONBLOCK); // 設定非阻塞
// 或使用 select() 多工

WinSock (Windows Socket)

整體模仿 Unix Socket,主要差異在初始化/清理與非同步機制。

1. 流程對照

Server:               Client:
WSAStartup()          WSAStartup()
WSASocket()           WSASocket()
bind()
listen()
WSAAccept()     <--  WSAConnect()
WSARecv()       <--  WSASend()
WSASend()       -->  WSARecv()
closesocket()   <->  closesocket()
WSACleanup()          WSACleanup()

2. 關鍵差異

  • WSAStartup/WSACleanup:載入/卸載 Winsock DLL,版本協商 (通常 MAKEWORD(2,2))。未呼叫 Cleanup 前不得再呼叫 Socket API。
  • 函數前綴 WSA:WSAAccept、WSARecv 等支援重疊 I/O 結構。

3. 三種非阻塞/非同步模型

WSAAsyncSelect 事件:FD_READ、FD_WRITE、FD_ACCEPT、FD_CLOSE、FD_CONNECT、FD_OOB 等。

小結

WinSock 在 Unix Socket 基礎上增加初始化/清理,並提供視窗訊息與事件物件兩種非同步模型。跨平台開發時,建議封裝共用介面,平台差異隔離在實作層。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
模型核心 API特點
非阻塞 + selectioctlsocket(FIONBIO) + select()移植 Unix 碼最簡單
WSAAsyncSelectWSAAsyncSelect(s, hwnd, msg, events)視窗訊息驅動,需 UI 執行緒
WSAEventSelectWSAEventSelect(s, hEvent, events)事件物件驅動,適合服務/無 UI 程式