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

ICMP 協定深度解析 (二):Windows Socket (Winsock) 核心 API 快速參考

     編輯:關於VC++

為支援後續 ICMP 應用程式開發,本文整理 Winsock 核心函數用法,作為快速查閱手冊。詳細參數與錯誤碼請參考 MSDN 文件。

初始化與清理


// 載入 Winsock DLL,協商版本
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
// 釋放 Winsock 資源
int WSACleanup(void);

Socket 建立與位址轉換


// 建立 Socket 描述子
SOCKET socket(int af, int type, int protocol);
// af: AF_INET (IPv4)
// type: SOCK_STREAM (TCP) / SOCK_DGRAM (UDP) / SOCK_RAW (原始)
// protocol: IPPROTO_TCP / IPPROTO_UDP / IPPROTO_ICMP

// 點分十進制字串 → 32-bit 網路序 IP
unsigned long inet_addr(const char *cp);

// 主機名稱 → hostent 結構 (含 IP 清單)
struct hostent *gethostbyname(const char *name);

資料收發 (TCP 連線導向)


// 接收資料 (阻塞模式下等待資料到達)
int recv(SOCKET s, char *buf, int len, int flags);
// flags: MSG_PEEK (窺視不移除) / MSG_OOB (帶外資料)
// 回傳: >0 收到位元組數, 0 連線關閉, SOCKET_ERROR 失敗

資料收發 (UDP/RAW 無連線)


// 發送資料至指定位址
int sendto(SOCKET s, const char *buf, int len, int flags,
           const struct sockaddr *to, int tolen);
// flags: MSG_DONTROUTE (繞過路由) / MSG_OOB
// 回傳: 實際發送位元組數或 SOCKET_ERROR

// 接收資料並取得來源位址
int recvfrom(SOCKET s, char *buf, int len, int flags,
             struct sockaddr *from, int *fromlen);

進階 I/O 模型 (非阻塞/非同步)

  • select():同步多工,監控多個 Socket 可讀/可寫/例外狀態,支援超時
  • WSAAsyncSelect():視窗訊息驅動 (WM_SOCKET_NOTIFY),適合 GUI 應用
  • WSAEventSelect():事件物件驅動,配合 WaitForMultipleObjects 實現高效能伺服器
  • Overlapped I/O (WSAOverlapped):Windows 原生非同步 I/O,完成端口 (IOCP) 架構基石

常用結構體


struct sockaddr_in {
    short   sin_family;   // AF_INET
    u_short sin_port;     // 網路序埠號
    struct  in_addr sin_addr; // IP 位址
    char    sin_zero[8];  // 填充對齊
};

struct in_addr {
    union {
        struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;
        struct { u_short s_w1,s_w2; } S_un_w;
        u_long S_addr;    // 32-bit IP (網路序)
    } S_un;
};

掌握上述 API 即可進行基礎網路程式開發,後續文章將實際應用於 RAW Socket Ping 及 Traceroute 實作。

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