两个IP的比较

标签 c linux comparison ip-address kernel-module

我需要比较两个 IP。一个 IP 以 u8 格式存储,我设法将其转换为 char * 我存储在变量 arp_tbuf 中。但是,要比较的第二个 IP 是 u32 格式(来自 ip.h)。但是每次我尝试将 u32 格式的 IP 转换为 char * 如下,

    unsigned int pkt_da = (unsigned int)ip_header->daddr;   
    char pkt_tbuf[16];
    char pkt_tbuf_tmp[4];

    pkt_tbuf_tmp[0] = pkt_da & 0x000000FF;
    pkt_tbuf_tmp[1] = (pkt_da & 0x0000FF00) >> 8;
    pkt_tbuf_tmp[2] = (pkt_da & 0x00FF0000) >> 16;
    pkt_tbuf_tmp[3] = (pkt_da & 0xFF000000) >> 24;  
    sprintf(pkt_tbuf, "%d.%d.%d.%d\n", pkt_tbuf_tmp[0], pkt_tbuf_tmp[1], pkt_tbuf_tmp[2], pkt_tbuf_tmp[3]);

我收到一个kernel panic 错误。

我知道 memcmp 与字符进行比较的功能。

如果各位专家能帮助我将此 IP 转换为 char *比较两个 IP,如 memcmp(arp_tbuf, pkt_tbuf).

非常感谢:)

编辑

正如@BobJarvis 所建议的,我在我的内核中再次运行了代码。 IT 可以很好地转换 LAN 中的 IP。但是,当我加载网页时,发生了 kernel panic 错误。我有更简洁的方法来执行从 unsigned intchar *(点分 IP 格式)的 IP 转换吗?

最佳答案

我相信您遇到了超过 127 的值(IP 的任何 2 字节部分)的问题。>>> 运算符是一个算术移位(保留符号)转变而不是逻辑转变。 (参见 Shift operator in C )。您可以通过 pkt_da = 0x7f7f7f7fpkt_da = 0x80808080 的简单测试在您的代码中看到这一点。打印值:

for (it = 0; it < 4; it++)
    printf ("  pkt_tbuf_tmp[%2d]: %u\n", it, pkt_tbuf_tmp[it]);

给予:

./bin/pktb 2139062143
pkt_tbuf_tmp[ 0]: 127
pkt_tbuf_tmp[ 1]: 127
pkt_tbuf_tmp[ 2]: 127
pkt_tbuf_tmp[ 3]: 127
Done - pkt_tbuf='127.127.127.127'

./bin/pktb 2155905152
pkt_tbuf_tmp[ 0]: 4294967168
pkt_tbuf_tmp[ 1]: 4294967168
pkt_tbuf_tmp[ 2]: 4294967168
pkt_tbuf_tmp[ 3]: 4294967168
Done - pkt_tbuf='-128.-128.-128.-128'

右移行为取决于编译器。因此,在一个盒子上有效的东西,可能不适用于另一个系统。

关于两个IP的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23847651/

相关文章:

c - gnu 科学库 (cblas) 符号查找错误

比较 char* 和 char

linux - 无法将 bool 值分配给 bash 中的变量?

ios - 如何将NSUserDefaults整数与另一个整数进行比较?

java - 如何检查整数是否在给定范围内?

c - 指向结构体类型数组的指针段错误

c - 函数未检测到 EOF

linux - 如何在文本文件中传递和访问环境变量

linux - 使用 ImageMagick : too many exceptions and blinking problem 创建 GIF 图像时出错

c++ - 为什么我可以使用默认的 <=> 而不是用户提供的调用 ==?