使用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;
}

运行结果:

时间: 2024-08-09 19:53:30

使用C语言判断一个IP 地址是否为私有地址的相关文章

如何判断一个IP地址是有效的组播地址

组播报文的目的地址使用D类IP地址,范围是从224.0.0.0到239.255.255.255.D类地址不能出现在IP报文的源IP地址字段.单播数据传输过程中,一个数据包传输的路径是从源地址路由到目的地址,利用"逐跳"(hop-by-hop)的原理在IP网络中传输.然而在ip组播环中,数据包的目的地址不是一个,而是一组,形成组地址.所有的信息接收者都加入到一个组内,并且一旦加入之后,流向组地址的数据立即开始向接收者传输,组中的所有成员都能接收到数据包.组播组中的成员是动态的,主机可以在

java语言判断一个数字是否为回文数字

判断一个整数是否是回文数.回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数. 示例 1: 输入: 121 输出: true 示例 2: 输入: -121 输出: false 解释: 从左向右读, 为 -121 . 从右向左读, 为 121- .因此它不是一个回文数. 示例 3: 输入: 10 输出: false 解释: 从右向左读, 为 01 .因此它不是一个回文数. 进阶: 你能不将整数转为字符串来解决这个问题吗? 解法一:使用字符串反转,比较反转前后的字符串是否相等 class

C语言 判断一个字符串是不是另一个旋转任意位所得

/************************************************************************************ 4.判断一个字符串是否为另外一个字符串旋转之后的字符串. 例如:给定s1 = AABCD和s2 = BCDAA,返回1, 给定s1=abcd和s2=ACBD,返回0. AABCD左旋一个字符得到ABCDA AABCD左旋两个字符得到BCDAA AABCD右旋一个字符得到DAABC AABCD右旋两个字符得到CDAAB ****

判断一个字符串是否是ip地址的实现方法

最近在学习java,研究一些算法,找些联系题,自己去下手试试.这里记录下学习历程,也增强自己的记忆.初学者,见笑了.从开始判断一个字符串是不是正规ipv4的地址开始练习吧,初步代码如下: public class isIpv4{ public String cutblank(String str){ //如果字符串前有空格            while(str.startsWith(""))            {            str=  str.substring(1

如何判断自己IP是内网IP还是外网IP

tcp/ip协议中,专门保留了三个IP地址区域作为私有地址,其地址范围如下: 10.0.0.0/8:10.0.0.0-10.255.255.255  172.16.0.0/12:172.16.0.0-172.31.255.255  192.168.0.0/16:192.168.0.0-192.168.255.255 使用保留地址的网络只能在内部进行通信,而不能与其他网络互连.如果要与外部通信,那么必须通过网关与外部通信,这里使用了NAT, NAPT技术就是用来保证通信的代理机制. 另外,一些宽带

java 实现判断合法IP

判断一个IP是否为合法IP其实就是看其格式是否满足IP格式 这里直接用java实现 public static boolean isIP(String ip){ String Ip = ip.replaceAll(" ",""); if(Ip.matches("\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}\\.\\d{1,3}")){ String st = Ip.split("\\."); if(Intege

有效私有地址

私有地址(Private address)属于非注册地址,专门为组织机构内部使用. 以下表列出留用的内部寻址地址 A类 10.0.0.0 --10.255.255.255 B类 172.16.0.0--172.31.255.255 C类 192.168.0.0--192.168.255.255 1. A类地址 ⑴ A类地址第1字节为网络地址,其它3个字节为主机地址.另外第1个字节的最高位固定为0. ⑵ A类地址范围:1.0.0.1到126.255.255.254. ⑶ A类地址中的私有地址和保留

判断一个字符串是不是一个合法的IP地址

最近在笔试的时候遇到碰一道算法题, 要求判断一个字符串是不是合法的ip地址. 将我的思路发出来分享一下,不一定正确,也不一定是最优的方法.希望能分享一些交流 要求用java或者c来实现,我的java代码: 1 public class Test_ip { 2 //程序入口 3 public static void main(String[] args) { 4 Solution s = new Solution(); // 业务逻辑放在Solution类里面 5 //String test_st

python教程判断一下一个 IP 在不在线?ping IP教程

假设今天老板给我们一个任务,让我们判断一下一个 IP 在不在线.我们随手用 python 写一个 ping IP 的代码: import os host = input('请输入要检测的 IP : ')result = os.popen('ping -c 1 -t 1 %s' % (host)).read() if 'ttl' in result: print('IP 在线')else: print('IP 不在线') [dl]15-4342[/dl] 现在,你作为一名审核代码的人员,不考虑代码