使用C ++对ipv6地址进行比较操作

时间:2009-12-30 11:03:50

标签: c++ ipv6

由于IPV6地址有16个字节,并且它们不是用c ++存储的数据类型, 我想存储IPV6地址,并对IPv6地址进行一些比较, 请让我知道怎么做

8 个答案:

答案 0 :(得分:5)

您可以将它们存储为unsigned char的普通数组,就像在C中一样。例如,unsigned char ipv6[16];。然后你可以使用任何数组比较算法比较它们。使用char*算法不是一种选择,因为ipv6地址的某些字节可能是0x00,因此可以通过基于字符串的算法解释为字符串结尾字符。

答案 1 :(得分:3)

您没有指定正在使用的平台或IP堆栈。在Windows上,IPV6地址存储在结构调用in6_addr中。在该结构中,您有u_char Byte [16]作为地址。使用std :: memcmp()可以比较两种结构。

在linux上,建议的标准也调用了in_addr中的struckt,并且可以像上面一样使用。更多信息here

答案 2 :(得分:2)

创建BYTE数组的包装类来存储ipv6地址和overload []运算符来访问单个字节,你可以重载运算符进行比较。

struct IPV6Address
{
  unsigned char address[16];
  unsigned char operator [] (int i) ; //
  bool operator == (const IPV6Address &ipv6) { //write you own logic }
  bool operator < (const IPV6Address &ipv6) { //write you own logic }
};

答案 3 :(得分:1)

另一种选择是定义你自己的结构,它可以覆盖像==!= []等运算符。在里面它可以实现像16个字符的数组或x个int的数组,可以根据建筑结构来定义,因为你不要不知道int的大小。还可以定义用于获取掩码等的操作。该方法允许容易地使用位操作符。

编辑:

您使用的是

吗?
  std::list<MyIPStruct> iplist 

好吗?

当您遍历列表时,您可以进行比较

iplist[i] < iplist[i+1]

如果我理解了你的问题,你就不知道怎么覆盖&gt;操作

struct  MyIPStruct {
  usigned char[16] bytes; // one option
// unsigned int[16 / sizeof(int)] bytes; // another option

 /* other methods... */

 bool operator > ( const MyIPStruct & ip2 ) { /* here is your code */}
};

答案 4 :(得分:1)

将您的IPV6阵列存储在std::vector中。 STL向量已包含运算符<==

答案 5 :(得分:0)

将它们存储为std :: strings。然后,您可以使用字符串比较运算符,因为这些运算符不会被包含的空字符所欺骗,至少对于相等/不等式的测试而言。对于关系测试(&lt;,&gt;等),您可能希望编写自己的函数,因为std :: string可能不会执行您想要的操作。

答案 6 :(得分:0)

用于比较定义自己的结构是更好的,还有一件事我将ip存储在Std列表中我需要定义重载的运算符&lt; == functions.so如何定义&lt;请发表任何线索

答案 7 :(得分:0)

最近不得不用相当繁忙的代码来处理类似的问题。远非理想,我使用的基本解决方案是创建一个具有多种不同数据类型的联合:

typedef union myip
{
unsigned char ip8[16];
unsigned int ip32[4];
unsigned long long ip64[2];
};

它有点古怪但很好用。要比较两个IP,只需要在64位整数类型上进行两次比较ip.ip64 [0] == ip.ip64 [0]&amp;&amp; ip.ip64 [1] = ip.ip64 [1]然后只需添加一些基本功能/宏来覆盖所需的比较。

要直接从外部结构复制IPv6,可以在ip8成员上使用memcpy或将结构转换为指针。 ip32有时对IPv4互操作操作有用(IPv4映射的IPv6地址)..等等。

如果除了相等之外的任何事情,请记住首先转换为主机字节顺序,因为IPv6数组始终以网络字节顺序存储。

相关问题