linux 内核中ip字符串与整数相互转换 手动实现inet_aton 与inet_ntoa 的功能
2014-01-22 18:18
1891 查看
最近在从ip
数据包中获取源IP时,由于源IP是一个unsigned int的32位整数,而且内核中无法调用inet_aton函数,所以需要自己编程,将ip字符串转换成32位的整数。
初步想想,写出一个原型:
上面的代码在用户态编译运行完全正确,但是在内核态编译时,遇到一个报警,sscanf对应%d要求输入一个(int *)的参数,但是却得到一个(unsigned
char*)的参数,所以编译器警告。将代码经过改进如下:
改进过的代码效率要低些,但是消除了告警。
反之,将整数转换为字符串,则要简单许多,代码如下:
数据包中获取源IP时,由于源IP是一个unsigned int的32位整数,而且内核中无法调用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]); }
相关文章推荐
- 关于linux下网络编程socket 转换IP问题 inet_ntoa()
- 编程实现整数和字符串的相互转换
- 输入一个表示整数的字符串,把该字符串转换成整数并输出(实现atoi函数功能)
- 给出函数atoi(x)的实现方法,其功能是将字符串x转换为整数
- C++实现字符串和整数之间的相互转换
- 点分十进制字符串IP与十进制整数相互转换方法
- (1411)实现字符串与整数的相互转换(不使用itoa和atoi)
- Go IP 地址字符串整数/string int 相互转换
- C语言实现字符串IP与整数型IP的相互转换
- Python实现字符串与数组相互转换功能示例
- ip 与 整数间 的相互转换 python实现
- tcp/ip中的 ip字符串转整数函数 inet_aton 源代码
- 用Shell脚本对IP的字符串与整数形式进行相互转换
- 实现一个函数stringToInt,实现把字符串转换成整数这个功能
- 实现字符串和整数的相互转换
- C语言通过函数实现 itoa()的功能 将整数转换成字符串 并实现进制转换
- ip 与 整数间 的相互转换 python实现
- tcp/ip中的 ip字符串转整数函数 inet_aton 源代码
- LINUX系统服务器上搭建DHCP服务,实现两大基本功能:1,自动分配ip;2,手工指定ip
- IP 地址转换 inet_addr() inet_ntoa() 笔记