【问题标题】:How to compare two ip address in c?如何比较c中的两个IP地址?
【发布时间】:2014-04-06 16:09:29
【问题描述】:

我正在尝试比较 ip 地址并查看它是否适合某个范围(即网络 ID 和广播 ID)

starting =(rt_walker->dest).s_addr;
subnet = (rt_walker->mask).s_addr;
broadcast = starting | (~subnet);
if(ip_address>=starting && ip_address<=broadcast){
       found_route =1;
 }

此代码运行良好,但如果我有 rt_walker->dest 的“10.0.0.0”,那么 这一行 (rt_walker->dest).s_addr 给了我 10 而不是 32 位二进制值。因此,如果将“10.0.0.0”(起始地址)与“9.90.100.78”(正在比较的 IP 地址)进行比较,它总是在范围(10 - 10.255.255.255)内,这不应该是真的。

【问题讨论】:

  • 在进行int比较之前切换字节顺序
  • 我该怎么做?有帮助代码吗?
  • 在一个有四个字符 a b c d 的数组中,你认为如何将顺序切换为 d c b a?这里没有别的东西。 linux.die.net/man/3/htonl 会这样做,否则手动。

标签: c networking casting ip


【解决方案1】:

这是比较两个 IP 地址的快速简便的方法:

int ipa_match(uint32_t addr1, uint32_t addr2, uint32_t mask)
{
    return !((addr1 ^ addr2) & mask);
}

XOR 告诉您两个地址中的哪些位不同。 AND 会告诉您它们是否在屏蔽部分有所不同。其余的应该是不言自明的。

【讨论】:

    【解决方案2】:

    正如@deviantfan 在 cmets 中提到的,我只需要拥有

    htonl((rt_walker-&gt;dest).s_addr)

    而且效果很好!!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-05-18
      • 2010-11-04
      • 2010-09-14
      • 2012-08-26
      • 2021-01-10
      • 2013-06-29
      • 2011-02-12
      • 1970-01-01
      相关资源
      最近更新 更多