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

最近在从ip 数据包中获取源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]);

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
inet_aton函数是一个用于将IPv4地址字符串转换为二进制形式的函数,它的主要功能是将形如 "192.168.1.1" 的字符串形式的IPv4地址转换成32位的整数,便于网络编程的一些操作。 要编写inet_aton函数,可以按照以下步骤进行: 1. 首先,需要解析IPv4地址字符串,判断其格式是否正确。IPv4地址由四个十进制数构成,每个数的范围是0-255,并且用点分隔。 2. 然后,将每个十进制数转换为二进制形式。可以使用 standard library 提供的 atoi 函数,将每个十进制数转换为对应的整数。 3. 接下来,将转换后的四个整数组合起来,形成一个32位的整数。可以使用位运算操作,将每个整数按位左移并累加。 4. 最后,将得到的32位整数作为函数的返回值。 下面是一个示例代码,展示了如何实现inet_aton函数: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> unsigned int inet_aton(const char* addr) { unsigned int ip = 0; int nums[4]; if (sscanf(addr, "%d.%d.%d.%d", &nums[0], &nums[1], &nums[2], &nums[3]) != 4) { printf("Invalid IP address format\n"); return 0; } for (int i = 0; i < 4; i++) { if (nums[i] < 0 || nums[i] > 255) { printf("Invalid IP address range\n"); return 0; } ip = (ip << 8) + nums[i]; } return ip; } int main() { const char* ip_addr = "192.168.1.1"; unsigned int ip = inet_aton(ip_addr); printf("IP address in binary format: %u\n", ip); return 0; } ``` 通过这段代码,我们可以将IPv4地址字符串 "192.168.1.1" 转换为二进制形式的整数,并且输出转换后的结果为 3232235777。这样,我们就成功地实现inet_aton函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值