我正在创建一个IP地址类包装器,我想根据RFC 5735 Section 4 - Special Use IPv4 Addresses区分地址类型。
我想
如果有人可以通过小样本代码帮助我,或者指向现有代码,我会很感激。可悲的是,我发现我的大脑无法围绕这个主题的复杂性,这就是为什么我特别要求样本代码。我知道要求这样的源代码是不礼貌的,我道歉。
答案 0 :(得分:0)
当提出统一的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;
}