Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何解析IP地址块IPv4/IPv6_C++_Ip Address - Fatal编程技术网

C++ 如何解析IP地址块IPv4/IPv6

C++ 如何解析IP地址块IPv4/IPv6,c++,ip-address,C++,Ip Address,我正在创建一个IP地址类包装器,我想根据不同的地址来区分地址类型 我想 能够测试地址是否在其中一个块内。 展开一个块,以便在返回时获得一个IPAddress对象数组。 如果有人能通过小样本代码来帮助我,或者向我指出现有的代码,我将不胜感激。可悲的是,我发现我的大脑无法围绕这个复杂的主题,这就是为什么我特别要求提供示例代码。我知道这样要求源代码是不礼貌的,我很抱歉。在提出统一的IP地址表示时,必须认识到IPv4地址占用4字节,IPv6地址需要16字节。一个简单的包装器实现将使用一个联合加上一个枚举

我正在创建一个IP地址类包装器,我想根据不同的地址来区分地址类型

我想

能够测试地址是否在其中一个块内。 展开一个块,以便在返回时获得一个IPAddress对象数组。
如果有人能通过小样本代码来帮助我,或者向我指出现有的代码,我将不胜感激。可悲的是,我发现我的大脑无法围绕这个复杂的主题,这就是为什么我特别要求提供示例代码。我知道这样要求源代码是不礼貌的,我很抱歉。

在提出统一的IP地址表示时,必须认识到IPv4地址占用4字节,IPv6地址需要16字节。一个简单的包装器实现将使用一个联合加上一个枚举鉴别器来指示地址类型。幸运的是,这不是必需的,因为IPv6地址中存在IPv4地址的明确表示。记住这一点,您的IP地址包装类可以如下所示:

class address
{
  /// Top 96 bits of v4-mapped-addr.
  static std::array<uint8_t, 12> const v4_mapped_prefix =
    {{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xff }};

public:
  address() = default;

  bool is_v4() const
  {
    return std::memcmp(&bytes_, &v4_mapped_prefix, 12) == 0;
  }

private:
  std::array<uint8_t, 16> bytes_;
};

你至少试过什么了吗?谢谢,这足以让我的大脑工作,谢谢!
bool is_loopback() const
{
  if (is_v4())
    return bytes_[12] == 127;
  else
    return ((bytes_[0] == 0) && (bytes_[1] == 0) &&
            (bytes_[2] == 0) && (bytes_[3] == 0) &&
            (bytes_[4] == 0) && (bytes_[5] == 0) &&
            (bytes_[6] == 0) && (bytes_[7] == 0) &&
            (bytes_[8] == 0) && (bytes_[9] == 0) &&
            (bytes_[10] == 0) && (bytes_[11] == 0) &&
            (bytes_[12] == 0) && (bytes_[13] == 0) &&
            (bytes_[14] == 0) && (bytes_[15] == 1));
}

bool is_broadcast() const
{
  return is_v4() &&
    bytes_[12] == 0xff && bytes_[13] == 0xff &&
    bytes_[14] == 0xff && bytes_[15] == 0xff;
}

bool is_multicast() const
{
  return is_v4() ? bytes_[12] == 224 : bytes_[0] == 0xff;
}