c++ - 如何解析 IP 地址 block IPv4/IPv6

标签 c++ ip-address

我正在创建一个 IP 地址类包装器,我想根据 RFC 5735 Section 4 - Special Use IPv4 Addresses 来区分地址类型.

我要

  • 能够测试地址是否在其中一个 block 内。
  • 扩展一个 block ,所以我在返回时得到一个 IPAddress 对象数组。

如果有人可以通过小示例代码帮助我,或者指出现有代码,我将不胜感激。可悲的是,我发现我的大脑无法解决这个主题的复杂性,这就是为什么我特别要求示例代码。我知道这样索取源代码是不礼貌的,我深表歉意。

最佳答案

在提出统一的 IP 地址表示时,重要的是要认识到 IPv4 地址占用 4 个字节,而 IPv6 地址需要 16 个字节。一个朴素的包装器实现将使用一个 union 加上一个枚举鉴别器来指示地址类型。幸运的是,这不是必需的,因为在 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;
}

关于c++ - 如何解析 IP 地址 block IPv4/IPv6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17467026/

相关文章:

c++ - InterlockedDecrement 使用 XADD 但 InterlockedIncrement 使用 INC?

c++ - vector会不会copy成数组?

PHP Curl,检索服务器 IP 地址

ip-address - arp 命令 - 这是什么意思? *和*从 IP 获取无线路由器 MAC 地址

c# - 获取公共(public)/外部 IP 地址?

iphone - 如何在iPhone上查询ARP表?

c++ - 按值内存泄漏的函数调用

c++ - 函数中定义的 std::string 保留其先前的值?

c++ - boost ipc new 和 delete 运算符

C#: 在 ProxyPass 之后获取 Client-IP