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

C語言實現 IP 地址合法性檢測與子網匹配完整指南

     編輯:關於C

功能概覽

純 C 實現,跨平台(Windows/Linux),提供四大核心功能:

  1. IP 地址合法性驗證
  2. 子網掩碼合法性驗證
  3. IP 與掩碼組合合法性驗證(含 A/B/C 類默認掩碼檢查、網絡/廣播地址排除、子網號全 0/全 1 排除)
  4. 兩 IP 是否在同一子網判斷

核心數據類型與字節序

  • 所有 IP/掩碼參數為 _UINT32(32 位無符號整數),**網絡字節序**(大端序)。
  • 關鍵轉換函數:
    • htonl/ntohl:主機序 ↔ 網絡序
    • inet_ntoa:網絡序 IP → 點分十進制字符串(返回靜態緩衝區,非線程安全)
    • inet_addr:點分十進制字符串 → 網絡序 IP

關鍵函數詳解

1. IP 合法性 netIpIsValid

int netIpIsValid(_UINT32 IP) {
    struct in_addr addr; addr.s_addr = IP;
    int i = inet_addr(inet_ntoa(addr)); // 雙重轉換規範化
    return (i != 0 && i != 0xffffffff); // 排除 0.0.0.0 和 255.255.255.255
}

測試:全 0、全 1 返回 FALSE;其餘 TRUE。

2. 掩碼合法性 netMaskIsValid

int netMaskIsValid(_UINT32 mask) {
    if (!netIpIsValid(mask)) return FALSE;
    unsigned long m = ntohl(mask); // 轉主機序判斷連續性
    return ((m | (m - 1)) == 0xffffffff); // 二進制必須是左邊全 1 右邊全 0
}

原理:合法掩碼主機序值為 111...1100...00,m-1 為 000...0011...11,或運算得全 1。

3. IP+掩碼組合合法性 netMaskAndIpIsValid

int netMaskAndIpIsValid(_UINT32 IP, _UINT32 mask) {
    // 1. 雙方單獨合法
    // 2. 根據 IP 類別檢查掩碼不小於默認掩碼
    //    A類(1-126): mask >= 255.0.0.0
    //    B類(128-191): mask >= 255.255.0.0
    //    C類(192-223): mask >= 255.255.255.0
    // 3. 排除網絡地址(主機位全0)和廣播地址(主機位全1)
    // 4. 排除子網號全0/全1 (RFC 1009)
}

4. 同子網判斷 netIPAndSubnetValid

int netIPAndSubnetValid(_UINT32 IP, _UINT32 subIP, _UINT32 mask) {
    // 雙 IP+mask 均合法,且 (IP & mask) == (subIP & mask)
}

測試用例摘錄

測試項輸入預期
IP合法0.0.0.0 / 255.255.255.255非法
掩碼合法255.255.255.192 (0xFFFFFFC0)合法
掩碼非法255.255.192.255 (非連續1)非法
C類IP+掩碼192.168.10.65 + 255.255.255.192匹配
同子網IP1=192.168.10.65, IP2=192.168.10.70, mask=255.255.255.192同網段

補充知識:IP 分類與子網劃分

  • A 類:1.0.0.0 - 126.255.255.255,默認掩碼 255.0.0.0 (/8)
  • B 類:128.0.0.0 - 191.255.255.255,默認掩碼 255.255.0.0 (/16)
  • C 類:192.0.0.0 - 223.255.255.255,默認掩碼 255.255.255.0 (/24)

子網劃分將主機位借用作為子網位。判斷同網段:(IP1 & mask) == (IP2 & mask)。網絡地址(主機位全 0)和廣播地址(主機位全 1)不可分配給主機。

編程規範提示

  • 布爾函數返回 TRUE/FALSE 時,調用處用 if (func()) 而非 if (func() == TRUE)。
  • inet_ntoa 返回靜態緩衝區,多線程或連續調用需拷貝結果。

總結

這套代碼系統性覆蓋了 IP 校驗的各種邊界條件,適合嵌入式網絡設備、防火牆、VPN 等場景。核心在於理解網絡字節序、掩碼連續性判斷、以及 RFC 規範中的保留地址排除邏輯。

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