比较两个IPv6地址及其掩码(窗口)

use*_*248 1 c++ equals mask ip-address ipv6

我必须比较两个IPv6地址及其掩码,看它们是否相同.它们都是字符串,例如"xxxx:xxxx:xxxx:xxxx/xx".我只是使用memcmp逐位比较它们,但是当真实时这可能返回false,因为xxxx:xxxx:0000:xxxx/xx和xxxx:xxxxx :: xxxxx/xx在技术上是相同的地址.

我宁愿不创建地址和掩码的子串,但如果有一个比较两个IPv6地址的函数,我会这样做.有什么建议?:)

Cel*_*ada 5

你应该使用转换为二进制形式的二进制形式inet_pton,然后比较二进制形式(你只能比较16个字节的数据memcmp).

如果您需要比较屏蔽地址,那么您将需要做更多的工作.inet_pton不会为你解析前缀长度("/ something")所以你必须:

  1. 找到斜线
  2. 将部分传递到斜线之前 inet_pton
  3. 使用普通ol解析斜杠后的整数 atoi
  4. 手动将128减去地址二进制形式末尾的位数

...在比较它们之前在每个地址上.

  • 在您的问题中,您暗示您要考虑匹配中的前缀长度,以便例如:: 1234:5678:9abc/128和:: 1234:5678:def0/128将是不相等的(比较所有128位),而: :1234:5678:9abc/112和:: 1234:5678:def0/112相等(因为/ 112前缀长度,后16位不计数).要实现这一点,您必须将不计数的位清零. (2认同)