先看看这两个函数的真面目,在说说我遇到的问题
unsigned int inet_addr(const char *cp);
unsigned int inet_network(const char *cp);
两个函数都是将字符ip转化成二进制地址
但是,前面一个是要考虑大小端的,如果机器本身是小端在前的话,对于255.0.0.0,前者的转化结果将会是0xff,而不是实际想得到的0x000000ff,当然这两个值本身意义上是一样的.
最近做一个通过ip和mask得到网段的函数,就在x86和ixp425上遇到 inet_addr的大小端问题,最后用inet_network给屏蔽了,因为后者是主机序列,不管机器的大小端.
贴如下代码
1输入mask 得到掩码位数
#include "stdio.h"
int main(int agrc,char *argv[])
{
int i = 0;
printf("%s\n",argv[1]);
unsigned int prefix = inet_addr(argv[1]);
printf("%x\n",prefix);
while (((prefix)& 0x1) == 0){
i++;
printf("%d\n",i);
prefix = prefix>>1;
}
return 32 - i;
}
输入255.255.255.0
在大端的模式下得到掩码位数是24
小端模式下无效
2通过输入ip 和mask 得到网段
#include "stdio.h"
int main(char agrc,char *argv[])
{
int i,x;
printf("%s\n",argv[1]);
printf("%s\n",argv[2]);
unsigned int ip = inet_network(argv[1]);
unsigned int prefix = inet_network(argv[2]);
printf("%8x %8x\n",ip,prefix);
x=0;
for(i=0;i<32;i++)
{
if(((prefix)& 0x1)== 0)
{
x++;
printf("%d %x\n",x,0x1< ip &=(0xffffffff< prefix = prefix>>1;
}
else
break;
}
printf("%x\n",ip);
return 0;
}
因为是主机序 所以没有大小端 任何机子都是一样的
输入192.168.0.1 255.255.255.0
得到192.168.0.0
阅读(2526) | 评论(0) | 转发(0) |