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

Winsock API 參考手冊 (二):inet_ntoa、ioctlsocket、listen 詳解

     編輯:VC 教學

Windows Sockets 1.1 核心 API 深度解析系列第二彈

本文依據 1993 年 Winsock 1.1 規範,詳細說明三個關鍵網路程式設計 API:網址轉換、Socket 模式控制、監聽佇列管理。

inet_ntoa:網路位址轉點分十進制字串

char FAR * PASCAL FAR inet_ntoa(struct in_addr in);

參數:in - 包含 IPv4 位址的 in_addr 結構 (s_addr 為網路序 32-bit 整數)。

回傳:

  • 成功:靜態緩衝區指標,格式 "a.b.c.d" (如 "192.168.1.1")
  • 失敗:NULL

關鍵注意:

  1. 回傳指標指向靜態緩衝區,非執行緒安全。多執行緒環境需立即複製內容或改用 InetNtop (IPv6 相容)
  2. 輸入 in_addr 必須為網路位元組序 (大端序),主機序需先 htonl
  3. 僅支援 IPv4,現代開發請使用 getnameinfo 或 InetNtop

ioctlsocket:Socket 模式與狀態控制

int PASCAL FAR ioctlsocket(SOCKET s, long cmd, u_long FAR *argp);

參數:s Socket 描述符,cmd 控制碼,argp 參數指標。

回傳:0 成功,SOCKET_ERROR 失敗 (呼叫 WSAGetLastError 取得錯誤碼)。

支援控制碼:

cmd功能argp 用途
FIONBIO啟用/停用非阻塞模式指向 u_long:非零=非阻塞,零=阻塞
FIONREAD取得可立即讀取的資料位元組數指向 u_long 接收回傳值
SIOCATMARKOOB 資料是否已讀完指向 u_long (Winsock 1.1 暫不支援)

非阻塞模式典型用法:

u_long mode = 1; // 1 = 非阻塞
ioctlsocket(s, FIONBIO, &mode);

配合 select 實現高併發 I/O 多路複用。

listen:將 Socket 置於被動監聽狀態

int PASCAL FAR listen(SOCKET s, int backlog);

參數:

  • s:已 bind 且未 connect 的 Socket (通常為 SOCK_STREAM)
  • backlog:待接受連線佇列最大長度

回傳:0 成功,SOCKET_ERROR 失敗。

關鍵語意:

  1. backlog 定義「已完成三向交握但尚未 accept」的連線上限
  2. Winsock 1.1 限制:最大值 5,最小值 1。現代版本 (Winsock 2) 可設 SOMAXCONN 由系統決定
  3. 超出 backlog 的新連線請求,用戶端收到 ECONNREFUSED 或被悄悄丟棄
  4. 必須在 bind 之後、accept 之前呼叫

三者協作典型流程 (TCP Server)

SOCKET s = socket(AF_INET, SOCK_STREAM, 0);
bind(s, (sockaddr*)&addr, sizeof(addr));
listen(s, 5);                    // 進入監聽狀態

// 非阻塞模式 (可選)
u_long nonblock = 1;
ioctlsocket(s, FIONBIO, &nonblock);

// 接受迴圈
while (running) {
    SOCKET client = accept(s, &cliAddr, &len);
    if (client != INVALID_SOCKET) {
        char *ip = inet_ntoa(cliAddr.sin_addr); // 顯示客戶端 IP
        // 建立工作執行緒處理 client...
    }
}

現代化建議

  • inet_ntoa → InetNtop(AF_INET, &addr, buf, sizeof(buf)) (執行緒安全、支援 IPv6)
  • ioctlsocket(FIONBIO) → fcntl(fd, F_SETFL, O_NONBLOCK) (POSIX) 或 WSAIoctl (擴展功能)
  • listen(backlog) → 使用 SOMAXCONN 讓系統自動調優
  • 高效能 Server 改用 IOCP (I/O Completion Ports) + AcceptEx/GetAcceptExSockaddrs

理解經典 API 運作機制,是掌握現代網路框架 (libuv, Boost.Asio, Netty) 底層原理的基石。

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