Chinaunix首页 | 论坛 | 博客
  • 博客访问: 485684
  • 博文数量: 78
  • 博客积分: 1771
  • 博客等级: 上尉
  • 技术积分: 944
  • 用 户 组: 普通用户
  • 注册时间: 2007-04-25 10:20
文章分类

全部博文(78)

文章存档

2014年(2)

2013年(10)

2012年(9)

2011年(7)

2010年(11)

2009年(10)

2008年(12)

2007年(17)

我的朋友

分类: LINUX

2008-09-01 01:42:07

 先看看这两个函数的真面目,在说说我遇到的问题
 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
阅读(2487) | 评论(0) | 转发(0) |
0

上一篇:一个感受

下一篇:C 语言内存管理

给主人留下些什么吧!~~