简体   繁体   English

IPv4 和 IPv6 地址检查器

[英]IPv4 and IPv6 address checker

When I am entering the string "192" and it parses the string, it continues to return IPv4 even when it is not a valid IPv4 address.当我输入字符串“192”并解析该字符串时,即使它不是有效的 IPv4 地址,它也会继续返回 IPv4。 I tried adding an else if (someIP.GetAddressBytes().Length == 1) but it still returns 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");
}

You can use the following code to validate IPv6 and IPv4 addresses:您可以使用以下代码验证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;
}

According to documentation , IPAddress.AddressFamily will return either InterNetwork for IPv4 or InterNetworkV6 for IPv6 .根据文档IPAddress.AddressFamily将返回InterNetwork for IPv4InterNetworkV6 for IPv6

The way that MS parses the string you're entering makes it a valid IP address. MS 解析您输入的字符串的方式使其成为有效的 IP 地址。 They've added a kind of shorthand for dealing with parts of an IP and then they fill in the blanks.他们添加了一种处理 IP 部分的速记,然后他们填补了空白。

If you look into the remarks section on this page you'll see what I'm talking about.如果您查看页面上的备注部分,您就会明白我在说什么。

There are many completely valid representations of an IP Address than just 0.0.0.0 format.除了 0.0.0.0 格式之外,还有许多完全有效的 IP 地址表示形式。 "192" probably parses to 0.0.0.192, which is why the program isn't crashing AND why it's length is 4. “192”可能解析为 0.0.0.192,这就是程序没有崩溃的原因,以及为什么它的长度是 4。

If you must only accepted dotted notation, use string.Split combined with int.Parse and create an IPAddress instance yourself.如果您必须只接受点分符号,请将 string.Split 与 int.Parse 结合使用并自己创建一个 IPAddress 实例。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM