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

本文探讨了在不同架构下,inet_addr函数在处理IP地址时可能出现的大端小端问题,并通过示例代码展示了如何使用inet_network函数避免这个问题。通过输入IP和掩码,实现计算网段的函数,该函数在主机序下不受机器大小端影响,确保了跨平台的正确性。
摘要由CSDN通过智能技术生成

先看看这两个函数的真面目,在说说我遇到的问题

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值