linux 内核中ip字符串与整数相互转换 手动实现inet_aton 与inet_ntoa 的功能

最近在从ip 数据包中获取源IP时,由于源IP是一个unsigned int32位整数,而且内核中无法调用inet_aton函数,所以需要自己编程,将ip字符串转换成32位的整数。

 

初步想想,写出一个原型:

unsigned int ip_str_to_num(const char *buf)

{

    unsigned int tmpip[4] = {0};

    unsigned int tmpip32 = 0;

    unsigned char *uip = (unsigned char*)&tmpip32;

 

    sscanf(buf, "%d.%d.%d.%d", &uip[0], &uip[1], &uip[2], &uip[3]);

    return tmpip32;

}


 

上面的代码在用户态编译运行完全正确,但是在内核态编译时,遇到一个报警,sscanf对应%d要求输入一个(int *)的参数,但是却得到一个(unsigned char*)的参数,所以编译器警告。将代码经过改进如下:

unsigned int ip_str_to_num(const char *buf)

{

    unsigned int tmpip[4] = {0};

    unsigned int tmpip32 = 0;

 

    sscanf(buf, "%d.%d.%d.%d", &tmpip[0], &tmpip[1], &tmpip[2], &tmpip[3]);

    tmpip32 = (tmpip[3]<<24) | (tmpip[2]<<16) | (tmpip[1]<<8) | tmpip[0];

    return tmpip32;

}


 

改进过的代码效率要低些,但是消除了告警。

 

反之,将整数转换为字符串,则要简单许多,代码如下:

 

#define IP_LEN 17

static inline void ip_num_to_str(unsigned int ip_num, char *ip_str)

{

        unsigned char * uip = (unsigned char *)&ip_num;

        snprintf(ip_str, IP_LEN , "%d.%d.%d.%d", uip[0], uip[1], uip[2], uip[3]);

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值