我想确定一个给定的IPv6地址是否是私有的或不是在C#中,我试图简单地在IPAddress类上使用'IsIPv6SiteLocal'属性。但是,如本comment中所解释的,此属性中实现的逻辑已被弃用。我跑了以下的单元测试:如何判断IPv6地址是否私密?
[TestMethod]
public void IsPrivate_ipv6_True()
{
// This sample private IPv6 address was generated using: http://unique-local-ipv6.com/
var ip = IPAddress.Parse("fd44:fda4:e1ba::1");
Assert.IsTrue(ip.IsIPv6SiteLocal);
}
在单元测试断言失败这证实了IsIPv6SiteLocal不正确地确定某个地址是本地的。所以我需要一个替代方案。
我写了下面的扩展方法,我想知道是否有人可以想到一个场景,它不会正确地确定该地址是私人/公共。
public static bool IsPrivateIPv6(this IPAddress address)
{
var addressAsString = address.ToString();
var firstWord = addressAsString.Split(new[] { ':' }, StringSplitOptions.RemoveEmptyEntries)[0];
// Make sure we are dealing with an IPv6 address
if (address.AddressFamily != AddressFamily.InterNetworkV6) return false;
// The original IPv6 Site Local addresses (fec0::/10) are deprecated. Unfortunately IsIPv6SiteLocal only checks for the original deprecated version:
else if (address.IsIPv6SiteLocal) return true;
// These days Unique Local Addresses (ULA) are used in place of Site Local.
// ULA has two variants:
// fc00::/8 is not defined yet, but might be used in the future for internal-use addresses that are registered in a central place (ULA Central).
// fd00::/8 is in use and does not have to registered anywhere.
else if (firstWord.Substring(0, 2) == "fc" && firstWord.Length >= 4) return true;
else if (firstWord.Substring(0, 2) == "fd" && firstWord.Length >= 4) return true;
// Link local addresses (prefixed with fe80) are not routable
else if (firstWord == "fe80") return true;
// Discard Prefix
else if (firstWord == "100") return true;
// Any other IP address is not Unique Local Address (ULA)
else return false;
}
EDITED 2016年2月13日:
- 确保第一个字是长至少4个字符由@RonMaupin的建议
- 改进评论上述 '否则返回false' 为由@RonMaupin建议
- 检查'fe80'前缀,如@KevinBurdett建议的
- 检查'Discard'前缀,如@KevinBurdett建议的
你还在检查已弃用区块的原因是什么?它自2004年以来已被弃用。此外'fc'仍未定义,您只需检查'fd'。您可以在这里找到更多信息。 https://en.wikipedia.org/wiki/Unique_local_address – Will
看起来像[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。为什么你认为你需要知道IPv6地址是否是唯一的本地地址与全局地址?你会如何使用这些信息?您发布的代码是否存在_specific_问题?你有没有具体的问题陈述?如上所述,你的问题是非常广泛的(“任何人都可以想到任何东西吗?”) –
@对'fd ::'(保留)之类的东西的简单检查'fd'将会失败。添加一个检查,看看第一个单词是否有四位数字会使这个更正确。 –