使用C語言判斷一個IP 地址是否為私有地址


參考:https://zhidao.baidu.com/question/191740827.html

私有IP地址范圍:
A: 10.0.0.0 10.255.255.255 10.0.0.0/8
B: 172.16.0.0 172.31.255.255 172.16.0.0/12
C: 192.168.0.0 192.168.255.255 192.168.0.0/16


在C語言中的 socket 結構體如下

struct sockaddr_in {
    short   sin_family;
    USHORT  sin_port;
    IN_ADDR sin_addr;
    CHAR sin_zero[8];
}

 

其中IP 地址字段為 sin_addr,當選擇IPv4類型的IP地址時,sin_addr 是一個網絡字節序的4字節的數字。

sample:
192.168.207.1
c0 a8 cf 01

Filter:
A: startwith 10.x.x.x
B: startwith 172.(16~31).x.x
C: startwith 192.168.x.x

判斷順序:

A -> C -> B

偽碼如下:

char data[4] = NetworkAddr;

 

if data[0] == 10:
  return true
elif data[0] == 192 and data[1] == 168:
  return true
elif data[0] == 172:
  if data[1] >= 16 and data[1] <= 31:
    return true
else:
  return False

 

#include <Windows.h>
#include <stdio.h>
#include <string.h>

#pragma comment(lib,"ws2_32.lib")        // inet_addr()


BOOL isLocalAddr(DWORD    netAddr)
{
    unsigned char    data[4];
    BOOL    bRet = FALSE;

    memcpy(data, (char *)&netAddr, 4);

    
    if (10 == data[0])
    {
        bRet = TRUE;
    }
    else if (192 == data[0] && 168 == data[1])
    {
        bRet = TRUE;
    }
    else if (172 == data[0])
    {
        if (data[1] >= 16 && data[1] <= 31)
        {
            bRet = TRUE;
        }
    }
    else if(!memcmp(data, servAddr, 4))
    {
        bRet = TRUE;
    }

    return bRet;
}

int main()
{
    char    *addrList[] = {
        "192.168.207.1",
        "192.12.1.3",

        "172.16.2.1",
        "172.33.1.1",

        "10.12.12.1",
        "43.1.31.23",
    };

    char    *result[] = {
        "X Local Address",
        "O Local Address"
    };

    int        addrCnt = sizeof(addrList) / sizeof(addrList[0]);
    DWORD    netAddr = 0;
    BOOL    ret = FALSE;

    for (int i = 0; i < addrCnt; i++)
    {
        netAddr = inet_addr(addrList[i]);
        ret = isLocalAddr(netAddr);
        printf("%-16s [%s]\n", addrList[i], result[ret]);
    }

    return 0;
}

 

運行結果:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM