实际需求
突发奇想,在手写一个自动配置网卡信息时,需手动算出子网掩码后再添加,比如/24 对应子网掩码为255.255.255.0,如果是其他掩码呢比如/21、/17 等等,你还要算几秒钟,多唠哦,用程序实现就很快了,我这里用shell和c混合编程来计算例如/23子网掩码为255.255.254.0 下面介绍方法 。
- 思路:
c程序:实现子网计算并返回输出,
shell脚本:对192.168.100.1/23分割并调用c程序计算,然后输出
C语言代码:
#include"stdio.h"
#include<stdlib.h>
/*
求子网掩吗,比如/23 转换为255.255.254.0
单位实现
*/
int getmask(int n) //转换为掩吗标准格式
{
int ns[]={128,64,32,16,8,4,2,1};
int y=0,sum=0;
y=n%8;
if(n==8)return 255;
for(int j=0;j<y;j++)/*将2转换为192*/
sum+=ns[j];
return sum;
}
int main(int argc,char *argv[])
{
int ns[]={128,64,32,16,8,4,2,1};
int i,n,y,sum=0;
int mask[]={0,0,0,0}; //存放子网掩吗
n=atoi(argv[1]); //将命令行参数字符串转数字
if(argc==2&&n>0&&n<33)
{
for(i=0;i<n/8;i++)
{
mask[i]=getmask(8);
}
mask[i]=getmask(n%8);
printf("%d.%d.%d.%d\n",mask[0],mask[1],mask[2],mask[3]);
}
else
{
printf("255.255.255.0\n"); //默认掩码/24
}
}
编写好c代码后用gcc编译成可执行文件
gcc -c set_ip.c
gcc set_ip.o -o set_ip.exe
调用c程序结果如下:
shell代码:
考虑到用c语言做字符串切割比较麻烦下面写了个shell脚本来实现
#!/bin/bash
netmask=255.255.255.0 #默认子网掩吗
#获得ip段和掩吗数字段
ip=`echo $1 | awk -F/ '{print $1}'`
nm=`echo $1 | awk -F/ '{print $2}'`
#判断ip后面有无参数
if [ -z $nm ];then
netmask=255.255.255.0 #没传参数默认掩码
else
netmask=`./set_ip.exe $nm` ##调用c程序set_ip.exe
fi
#输出结果
echo " ip: $ip"
echo "netmask: $netmask"
shell调用c程序结果:
注意:确保你c的执行程序和shell脚本在同一路径下!你的shell脚本要有执行权限
chmod u+x 脚本名 #加执行权限
./shell脚本名 192.168.100.1/24 #脚本名你自己随便取 ,后面掩码/24你也可以不加默认为/24
总结:实际证明shell可以很好的调用c程序,有同样想法的小伙伴可以参考哦,本脚本掩码计算功能实现了 ,如果自己还有兴趣可以扩展一下,比如说通过掩码求网络号和主机号等等。编程最重要的就是要有骚想法,解决实际问题,不然没啥意思。哈哈。