【问题标题】:IPv4 and IPv6 address checkerIPv4 和 IPv6 地址检查器
【发布时间】:2015-11-11 00:05:22
【问题描述】:

当我输入字符串“192”并解析字符串时,即使它不是有效的 IPv4 地址,它也会继续返回 IPv4。我尝试添加一个 else if (someIP.GetAddressBytes().Length == 1) 但它仍然返回 IPv4。

IPAddress someIP = IPAddress.Parse("192");

if (someIP.GetAddressBytes().Length == 4)
{
    Console.WriteLine("IPv4");
}
else if (someIP.GetAddressBytes().Length == 16)
{
    Console.WriteLine("IPv6");
}
else
{
    Console.WriteLine("Neither");
}

【问题讨论】:

  • 是什么让您认为192 不是有效的IP 地址?
  • IPAddress.Parse 似乎以与ping.exe 类似的方式解析地址 - 请参阅此超级用户关于其他有效 IP 地址表示的回答:superuser.com/a/486936/270560
  • @cubrr 很可能是因为它使用相同的底层代码,也可能符合(IETF?)标准。
  • @DavidG 你是对的,他们使用相同的底层代码。 WSAStringToAddress 是他们使用的。关于标准:RFC 791 声明:“地址是四个八位字节(32 位)的固定长度。”。我没有找到关于“有效”地址的任何其他标准,所以我只能假设解析器行为特定于 Windows:msdn.microsoft.com/en-us/library/windows/desktop/…
  • 这就是为什么它被称为 dotted "notation"。 192.168.1.1 只是 32 位数字的一种表示(人类很容易记住)。任何 32 位数字都可以这样表示,而不仅仅是 IP 地址。

标签: c# ip-address


【解决方案1】:

您可以使用以下代码验证IPv6IPv4 地址:

public static bool IsValidIP(string address)
{
    IPAddress ip;
    if (!IPAddress.TryParse(address, out ip)) return false;

    switch (ip.AddressFamily)
    {
        case AddressFamily.InterNetwork:
            if (address.Length > 6 && address.Contains("."))
            {
                string[] s = address.Split('.');
                if (s.Length == 4 && s[0].Length > 0 && s[1].Length > 0 && s[2].Length > 0 && s[3].Length > 0)
                    return true;
            }
            break;
        case AddressFamily.InterNetworkV6:
            if (address.Contains(":") && address.Length > 15)
                return true;
            break;
    }
    return false;
}

根据documentationIPAddress.AddressFamily 将返回InterNetwork 用于IPv4InterNetworkV6 用于IPv6

【讨论】:

  • 我不得不稍微修改一下,因为它不适用于 12.9 之类的输入(如 cubrr 所述),但谢谢你:)
  • 它实际上并没有返回 IP,它会中断询问者提供的输入。
  • @Chet 哦,我的问题中没有提到它,但我只需要它来打印“IPv4”、“IPv6”或“Neither”,所以我将方法更改为无效。当我输入 192 时,我的程序没有中断,它返回 false(如 kraden 的响应所示)或打印“Neither”。
【解决方案2】:

MS 解析您输入的字符串的方式使其成为有效的 IP 地址。他们为处理 IP 的某些部分添加了一种速记,然后他们填补了空白。

如果您查看this 页面上的备注部分,您会明白我在说什么。

【讨论】:

    【解决方案3】:

    除了 0.0.0.0 格式之外,还有许多完全有效的 IP 地址表示。 “192”可能会解析为 0.0.0.192,这就是程序没有崩溃的原因以及它的长度为 4 的原因。

    如果您必须只接受点分表示法,请使用 string.Split 结合 int.Parse 并自己创建一个 IPAddress 实例。

    【讨论】:

    • 感谢您的建议。我将使用 string.Contains 来查看字符串是否有“。”或者 ”:”。我认为这会奏效
    • @corinne 如果您只使用string.Contains,您还将允许使用192.0 之类的地址。如果您要验证地址是否有四个八位字节,您可能想做的不仅仅是string.Contains
    • 或使用regex
    • 啊,是的..这是真的@cubrr。谢谢你告诉我这个大声笑
    猜你喜欢
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 2013-09-18
    • 1970-01-01
    • 2019-07-13
    相关资源
    最近更新 更多