C语言 根据掩码计算网段的起止ip
原文地址:https://www.yuque.com/docs/share/85a26263-484a-42f6-880b-2b511ae1bd20?#
根据ipv4掩码计算
#include <stdio.h>
#include <arpa/inet.h> #define uint8_t unsigned char
#define uint32_t unsigned int int main(int argc,char **argv)
{
// 1.1.0.0/16的网段
uint32_t ipv4 = 0x1010000;
uint8_t prefix = 16; uint32_t shift_bits = 32 - prefix;
uint32_t host_ipv4 = ipv4 >> shift_bits; //网络段 1.1.0.0是不变的
host_ipv4++; //先算出下一个网段 0x102
//1.1.0.0网段最后一个地址是0x1020000 -1
uint32_t end_ipv4 = (host_ipv4<<shift_bits)-1; // 101ffff
printf("start ip: %x end ip: %x\n",ipv4,end_ipv4);
end_ipv4 = htonl(end_ipv4); // ffff0101
char ip_str[20]={0};
inet_ntop(AF_INET, &end_ipv4, ip_str, INET_ADDRSTRLEN); // 1.1.255.255
printf("end ip: %s \n",ip_str); return 0;
}
运行结果
$ gcc -o ip_calculator ip_calculator.c
$ ./ip_calculator
start ip: 1010000 end ip: 101ffff
end ip: 1.1.255.255
根据ipv6掩码计算
#include <stdio.h>
#include <arpa/inet.h> #define uint8_t unsigned char
#define uint32_t unsigned int int main(int argc,char **argv)
{
uint8_t ipv6[16]={0};
char IPdotdec[46]="1:1:1:eeff::";
inet_pton(AF_INET6, IPdotdec, (void *)&ipv6);
printf("十六进制 : %s \n",IPdotdec); uint8_t prefix = 54;
uint32_t shift_bits = 128 - prefix;
uint32_t total_shift_byte,remain_shift_bits,j;
uint8_t host_ipv6 = 0, host2_ipv6 = 0,host_max = 0xFF;
uint8_t host_ipv6_str = 0;
uint8_t reach_host_max = 0;
total_shift_byte = shift_bits/8; //6
remain_shift_bits = shift_bits%8; //6 for(j = 0; j < total_shift_byte+1; j++)
{
if(j < total_shift_byte){
//e.g. prefix_len = 48. addr[0] ~ [5] is fixed,addr[6]~[15] is variable init to 0
ipv6[15-j] = 0xff;
}
else if(remain_shift_bits)
{
//just parts of this byte shitf to 0
host_ipv6 = ipv6[15-j]>> remain_shift_bits;
host_ipv6++;
host_ipv6 = (host_ipv6<<remain_shift_bits)-1;
ipv6[15-j]= host_ipv6 ;
break; // find the fix addr[15-j],case 1:just 1 byte affected
}
printf("ipv6[%u]:0x%x %x remain_shitf %u\n",15-j,ipv6[15-j],host_ipv6,remain_shift_bits);
}
char ipv6_str1[46]={0};
inet_ntop(AF_INET6,ipv6, ipv6_str1,INET6_ADDRSTRLEN);
printf("ip %s, shift addr[%u]\n", ipv6_str1, 15-j); return 0;
}
运行结果:
$ ./ipv6_calculator
十六进制 : 1:1:1:eeff::
ipv6[15]:0xff 0 remain_shitf 2
ipv6[14]:0xff 0 remain_shitf 2
ipv6[13]:0xff 0 remain_shitf 2
ipv6[12]:0xff 0 remain_shitf 2
ipv6[11]:0xff 0 remain_shitf 2
ipv6[10]:0xff 0 remain_shitf 2
ipv6[9]:0xff 0 remain_shitf 2
ipv6[8]:0xff 0 remain_shitf 2
ipv6[7]:0xff 0 remain_shitf 2
ip 1:1:1:efff:ffff:ffff:ffff:ffff, shift addr[6]
C语言 根据掩码计算网段的起止ip的更多相关文章
- 掩码计算工具netmask
掩码计算工具netmask 在网络扫描和防火墙配置中,经常需要计算IP地址范围和对应的掩码.为了简化这个过程,Kali Linux预置了一个掩码计算工具netmask.该工具不仅可以根据IP地址范 ...
- access-list/eigrp等 反掩码计算
access-list/eigrp等 反掩码计算 原则:地址部分,相同的照写,不同的写"0" 反掩码部分,相同的写"0",不同的写"1&quo ...
- 使用nmap工具查询局域网某个网段正在使用的ip地址
linux下nmap工具可扫描局域网正在使用的ip地址 查询局域网某网段正在使用的ip地址: nmap -sP .* 以上命令,将打印10.10.70.*/24网络所有正在使用的ip地址
- R语言的导数计算(转)
转自:http://blog.fens.me/r-math-derivative/ 前言 高等数学是每个大学生都要学习的一门数学基础课,同时也可能是考完试后最容易忘记的一门知识.我在学习高数的时候绞尽 ...
- [C语言]数据类型与计算
------------------------------------------------------------------------------------------------- 实际 ...
- 计算机网络-将C网192.168.25.0划分四个子网,计算每个子网的有效IP地址范围和对应网络掩码
首先计算子网掩码: 将256/4=64,主机块大小64 2的6次方=64 根据主机数量计算出掩码的最后一个字节为11000000,用十进制表示掩码为255.255.255.192 由于IP地址结尾全为 ...
- php计算网段内所有IP,分配子网段
由于最近业务需要,写了个获取网段内所有IP的函数,以及分配可用子网段的函数 /** * 根据网段获取计算所有IP * @param string $segment 网段 '139.217.0.1/24 ...
- c语言经典算法---计算Fibonacci数列
算法是一个程序和软件的灵魂,作为一名优秀的程序员,只有对一些基础的算法有着全面的掌握,才会在设计程序和编写代码的过程中显得得心应手.下面我就分享一个C语言中比较基础却极为重要的一个算法----计算Fi ...
- 开源的c语言人工神经网络计算库 FANN
这年头机器学习非常的火,神经网络算是机器学习算法中的比较重要的一种.这段时间我也花了些功夫,学了点皮毛,顺便做点学习笔记. 介绍人工神经网络的基本理论的教科书很多.我正在看的是蒋宗礼教授写的<人 ...
- C语言中用于计算数组长度的函数 “strlen() ”。
de>#include<stdio.h>#include<stdlib.h>#define MAX_LEN 255int my_strlen1(const char* s ...
随机推荐
- C#-8 数组
一 关于数组 数组是由一个变量名称表示的一组同类型的数据元素.数组中的元素通过变量名和方括号索引来访问. int[] intArray = new int[] { 1, 2, 3 }; //声明了一个 ...
- MySQL实战,SQL语句
student数据库 student学生表,course课程表表,sc成绩表 -- 1.找出成绩为95分的学生的姓名 SELECT Sname FROM student WHERE Sno IN( S ...
- PTA 1126 Eulerian Path
无向连通图,输出每个顶点的度并判断Eulerian.Semi-Eulerian和Non-Eulerian这3种情况,我们直接记录每个点所连接的点,这样直接得到它的度,然后利用深度优先和visit数组来 ...
- C++和Java多维数组声明和初始化时的区别与常见问题
//C++只有在用{}进行初始化的时候才可以仅仅指定列数而不指定行数,因为可以通过直接//初始化时的元素个数自动计算出行数.而仅声明/创建数组而不初始化时,Cpp要求必须写明//行数和列数才能够创建数 ...
- hibernate validation 手动参数校验 不经过spring
/** * 校验工具类 * @author wdmcygah * */ public class ValidationUtils { private static Validator validato ...
- vulnhub靶场|NAPPING: 1.0.1
准备: 攻击机:虚拟机kali.本机win10. 靶机:NAPPING: 1.0.1,地址我这里设置的桥接,,下载地址:https://download.vulnhub.com/napping/nap ...
- 『现学现忘』Git基础 — 37、标签tag(二)
目录 5.共享标签 6.删除标签 7.修改标签指定提交的代码 8.标签在.git目录中的位置 9.本文中所使用到的命令 提示:接上一篇文章内容. 5.共享标签 默认情况下,git push 命令并不会 ...
- 33.ModelSerializer详解
ModelSerializer特点 根据Model模型的定义,自动生成字段 自动生成相应的验证器 实现create和update 自动默认将关系字段映射成PrimaryKeyRelatedField主 ...
- React+echarts (echarts-for-react) 画中国地图及省份切换
有足够的地图数据,可以点击到街道,示例我只出到市级 以umi为框架,版本是: "react": "^18.2.0", "umi": &quo ...
- Go语言核心36讲35
到目前为止,我们已经一起学习了Go语言标准库中最重要的那几个同步工具,这包括非常经典的互斥锁.读写锁.条件变量和原子操作,以及Go语言特有的几个同步工具: sync/atomic.Value: syn ...