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

Winsock API 函數參考手冊 (一):連線建立、資料傳輸與位址轉換基礎

     編輯:關於C++

前言:Winsock 1.1 規範完整函數清單

Windows Sockets API (Winsock) 1.1 版 (1993/01/20) 定義 **30 個 BSD 標準函數** 與 **16 個 Windows 專屬擴充函數**,支援 **Stream (TCP)** 與 **Datagram (UDP)** 兩種 Socket 型態。本文為系列第一部分,涵蓋連線建立、資料傳輸、位址轉換等基礎 API (第 1-10 號)。

Socket 模式對照

  • 阻塞模式:呼叫函數進入內部等待條件滿足才返回,但 Windows 允許處理視窗訊息 (鍵盤/滑鼠),不可再呼叫其他 Socket API (否則 WSAEINPROGRESS)
  • 非阻塞模式:立即依當前狀態返回,不等待
  • 非同步模式:透過 PostMessage 通知完成,需指定視窗控制代碼與訊息編號

BSD Socket 函數詳細規格 (1-10)

(1) accept — 接受連線請求

SOCKET PASCAL FAR accept(SOCKET s, struct sockaddr FAR *addr, int FAR *addrlen);
  • 伺服器端呼叫,從監聽 Socket 佇列取出已完成連線
  • 回傳**新 Socket**,不可再用於 accept;原 Socket 繼續監聽
  • 阻塞模式下無連線請求會封鎖;非阻塞模式立即返回 WSAEWOULDBLOCK

(2) bind — 指定本地位址

int PASCAL FAR bind(SOCKET s, const struct sockaddr FAR *name, int namelen);
  • 將 Socket 繫結至特定 IP/Port
  • name 可設 INADDR_ANY (所有介面) + Port 0 (系統自動指派 1024-5000)
  • 實際綁定值可事後用 getsockname 取得

(3) closesocket — 關閉 Socket

int PASCAL FAR closesocket(SOCKET s);
  • 參考計數機制:計數=1 釋放 Kernel 物件;>1 僅遞減計數
  • SO_DONTLINGER:立即返回,資料背景送完
  • SO_LINGER:l_linger=0 立即重置 (資料遺失);>0 等待送完或逾時

(4) connect — 發起連線

int PASCAL FAR connect(SOCKET s, const struct sockaddr FAR *name, int namelen);
  • 客戶端主動連線至伺服器位址
  • 位址為 0 會失敗
  • 成功後可收發資料

(5) getpeername — 取得對端位址

int PASCAL FAR getpeername(SOCKET s, struct sockaddr FAR *name, int FAR *namelen);
  • 僅適用**已連線** Socket

(6) getsockname — 取得本端位址

int PASCAL FAR getsockname(SOCKET s, struct sockaddr FAR *name, int FAR *namelen);
  • 取得 Socket 綁定的實際 IP/Port
  • 若綁定 INADDR_ANY,需連線成功後才能取得具體 IP

(7) getsockopt — 查詢 Socket 選項

int PASCAL FAR getsockopt(SOCKET s, int level, int optname, char FAR *optval, int FAR *optlen);
  • level:SOL_SOCKET, IPPROTO_TCP
  • 可查選項:SO_ACCEPTCONN (是否監聽中)、SO_TYPE (Socket 型態)、SO_ERROR (延遲錯誤碼)、TCP_NODELAY 等

(8) htonl — 32-bit 主機序轉網路序

u_long PASCAL FAR htonl(u_long hostlong);

(9) htons — 16-bit 主機序轉網路序

u_short PASCAL FAR htons(u_short hostshort);

(10) inet_addr — 字串 IP 轉 32-bit 無號長整數

unsigned long PASCAL FAR inet_addr(const char FAR *cp);
  • 支援格式:a.b.c.d, a.b.c, a.b, a
  • 失敗回傳 INADDR_NONE
  • 現代替代:inet_pton (支援 IPv6)

Windows 專屬擴充函數清單

  • 非同步操作:WSAAsyncGetHostByName, WSAAsyncSelect, WSACancelAsyncRequest
  • 阻塞控制:WSACancelBlockingCall, WSAIsBlocking, WSASetBlockingHook, WSAUnhookBlockingHook
  • 啟動/清理:WSAStartup, WSACleanup
  • 錯誤處理:WSAGetLastError, WSASetLastError

下一篇預告

下集將說明 inet_ntoa, ioctlsocket, listen, ntohl/ntohs, recv/recvfrom, select, send/sendto, setsockopt, shutdown, socket 等進階 I/O 與控制函數。

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