【问题标题】:Comparison of two IPs两个IP的比较
【发布时间】:2014-07-13 21:37:08
【问题描述】:

我需要比较两个 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 格式)?

【问题讨论】:

  • @BobJarvis 哦错误..我会在问题中更正:)
  • 现在,“u8 格式”是什么意思?请出示声明。谢谢。
  • @JimGarrison 哦,我会尽快检查的……完全错过了。非常感谢你:)
  • 我刚刚在Ideone 测试了您的代码,它编译并运行良好。 (请注意,我使用文字作为 IP 地址)。你的代码中一定有其他东西导致内核恐慌。尝试获取我在 Ideone 测试过的代码,在您的站点上编译并运行它,然后看看您会得到什么。谢谢。
  • “发生于”并不意味着“发生于”。 16 个字符不足以包含 4 个 3 字符四边形三个点换行符终止空字符。只是说。

标签: c linux comparison ip-address kernel-module


【解决方案1】:

通过@DavidC.Rankin 的解释,我能够缩小范围并寻找更多解决方案。因此,我找到了一个类似的帖子,它解决了将 int IP 转换为点 IP 的问题, Convert source IP address from struct iphdr* to string equivalent using Linux netfilter

然后我刚刚表演了memcmp()

int cmp;
cmp=memcmp ( arp_tbuf, pkt_tbuf, sizeof(arp_tbuf) );

if((cmp > 0) || (cmp < 0)){
    printk(KERN_ALERT "Not matching");              
}

感谢专家帮助我理解问题。 :)

【讨论】:

    【解决方案2】:

    我相信您遇到了值(IP 的任何 2 字节部分)超过 127 的问题。&gt;&gt; 运算符是 算术移位(符号保留)移位而不是 逻辑转变。 (见 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 值?
    • 很高兴您找到了解决方案。这与我的想法一致。看看inet_pton 函数。
    • 是的,先生,您的建议帮助我为我的问题寻找具体的解决方案。非常感谢+1
    猜你喜欢
    • 2017-05-16
    • 2011-02-12
    • 1970-01-01
    • 2014-04-06
    • 2017-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-24
    相关资源
    最近更新 更多