Linux下两个网络函数inet_addr和inet_network (2008-09-01 01:42)


 先看看这两个函数的真面目,在说说我遇到的问题
 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<<x);
    ip &=(0xffffffff<<x);
    prefix = prefix>>1;
  }
  else
   break;
 }
 printf("%x\n",ip);
 return 0;
}
因为是主机序 所以没有大小端 任何机子都是一样的
输入192.168.0.1 255.255.255.0
得到192.168.0.0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值