純 C 實現,跨平台(Windows/Linux),提供四大核心功能:
_UINT32(32 位無符號整數),**網絡字節序**(大端序)。htonl/ntohl:主機序 ↔ 網絡序inet_ntoa:網絡序 IP → 點分十進制字符串(返回靜態緩衝區,非線程安全)inet_addr:點分十進制字符串 → 網絡序 IPnetIpIsValidint 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。
netMaskIsValidint 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。
netMaskAndIpIsValidint 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)
}
netIPAndSubnetValidint 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 | 同網段 |
子網劃分將主機位借用作為子網位。判斷同網段:(IP1 & mask) == (IP2 & mask)。網絡地址(主機位全 0)和廣播地址(主機位全 1)不可分配給主機。
TRUE/FALSE 時,調用處用 if (func()) 而非 if (func() == TRUE)。inet_ntoa 返回靜態緩衝區,多線程或連續調用需拷貝結果。這套代碼系統性覆蓋了 IP 校驗的各種邊界條件,適合嵌入式網絡設備、防火牆、VPN 等場景。核心在於理解網絡字節序、掩碼連續性判斷、以及 RFC 規範中的保留地址排除邏輯。