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

Winsock API 函數參考手冊 (三):Socket 選項、關閉、名稱解析與服務查詢

     編輯:關於C++

前言:Winsock 1.1 規範函數第三部分

本文續整理 Winsock 1.1 規範中剩餘核心 API,涵蓋 Socket 選項設定、關閉控制、Socket 建立、主機名稱/位址解析、協定/服務查詢 等函數 (第 21-30 號)。

函數詳細規格

(21) setsockopt — 設定 Socket 選項

int PASCAL FAR setsockopt(SOCKET s, int level, int optname,
                          const char FAR *optval, int optlen);
  • 層級:SOL_SOCKET (通用)、IPPROTO_TCP (TCP 專用)
  • 常用選項 (Value/Type):
選項型別說明
SO_BROADCASTBOOL允許廣播傳送
SO_DEBUGBOOL啟用除錯記錄 (*未實作)
SO_DONTLINGERBOOL關閉時不等待資料送完
SO_DONTROUTEBOOL繞過路由直接傳送 (*未實作)
SO_KEEPALIVEBOOL啟用 TCP 保活機制 (*未實作)
SO_LINGERstruct linger*關閉行為控制 (l_onoff, l_linger)
SO_OOBINLINEBOOL緊急資料內嵌正常資料流
SO_RCVBUFint接收緩衝區大小 (*未實作)
SO_REUSEADDRBOOL允許重複使用本地位址
SO_SNDBUFint發送緩衝區大小 (*未實作)
TCP_NODELAYBOOL停用 Nagle 演算法 (立即傳送小封包)

(22) shutdown — 關閉傳輸方向

int PASCAL FAR shutdown(SOCKET s, int how);
  • how=0:禁止接收 (後續 recv 失敗)
  • how=1:禁止傳送 (後續 send 失敗)
  • how=2:雙向禁止
  • 注意:不釋放 Socket 資源,必須後續呼叫 closesocket

(23) socket — 建立 Socket

SOCKET PASCAL FAR socket(int af, int type, int protocol);
  • af:PF_INET (IPv4)
  • type:SOCK_STREAM (TCP)、SOCK_DGRAM (UDP)
  • protocol:0 表自動選擇 (TCP/UDP)
  • 回傳 INVALID_SOCKET 表失敗

(24) gethostbyaddr — 位址反解主機資訊

struct hostent FAR * PASCAL FAR gethostbyaddr(const char FAR *addr, int len, int type);
  • addr:網路序位址 (IPv4 為 4 bytes)
  • type:PF_INET
  • 回傳 hostent 結構:h_name (正式名稱)、h_aliases (別名陣列)、h_addr_list (位址陣列)

(25) gethostbyname — 主機名稱正解

struct hostent FAR * PASCAL FAR gethostbyname(const char FAR *name);
  • 支援主機名稱或 "a.b.c.d" 字串
  • 回傳結構同 gethostbyaddr
  • 現代替代:getaddrinfo (支援 IPv6、非阻塞、執行緒安全)

(26) gethostname — 取得本機主機名稱

int PASCAL FAR gethostname(char FAR *name, int namelen);
  • 將本機主機名稱複製至緩衝區

(27) getprotobyname / (28) getprotobynumber — 協定查詢

struct protoent FAR * PASCAL FAR getprotobyname(const char FAR *name);
struct protoent FAR * PASCAL FAR getprotobynumber(int number);
  • 回傳 protoent:p_name、p_aliases、p_proto (協定號,如 TCP=6, UDP=17)

(29) getservbyname / (30) getservbyport — 服務查詢

struct servent FAR * PASCAL FAR getservbyname(const char FAR *name, const char FAR *proto);
struct servent FAR * PASCAL FAR getservbyport(int port, const char FAR *proto);
  • proto:"tcp" 或 "udp"
  • 回傳 servent:s_name、s_aliases、s_port (網路序)、s_proto
  • 常用服務:HTTP(80/TCP), FTP(21/TCP), DNS(53/UDP+TCP), SNMP(161/UDP)

系列總結

三篇文章完整涵蓋 Winsock 1.1 規範 30 個 BSD 函數與 16 個 Windows 擴充函數。現代開發建議:

  • 使用 getaddrinfo/getnameinfo 取代 gethostbyname 等舊式 API
  • 採用 WSAEventSelect/WSAAsyncSelect/IOCP 替代 select 提升擴展性
  • 錯誤處理統一呼叫 WSAGetLastError()
  • 記得 WSAStartup/WSACleanup 配對呼叫
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved