Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# IPv4和IPv6地址检查器_C#_Ip Address - Fatal编程技术网

C# IPv4和IPv6地址检查器

C# IPv4和IPv6地址检查器,c#,ip-address,C#,Ip Address,当我输入字符串“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.GetA

当我输入字符串“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");
}

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


如果您查看第页的备注部分,您将看到我在说什么。

IP地址有许多完全有效的表示形式,而不仅仅是0.0.0.0格式。“192”可能解析为0.0.0.192,这就是为什么程序没有崩溃,为什么它的长度是4


如果必须只接受虚线表示法,请使用string.Split和int.Parse并自己创建一个IPAddress实例。

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

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;
}

根据,,
IPAddress.AddressFamily
将返回
IPv4
InterNetwork
IPv6
InterNetworkV6
IPv6

是什么让你认为
192
不是有效的IP地址?
IPAddress.Parse
似乎以类似于
ping.exe
的方式解析地址-看到了吗超级用户对其他有效IP地址表示的回答:@cubrr最有可能是因为它使用了相同的底层代码,这也可能符合(IETF?)标准。@DavidG您使用相同的底层代码是对的
wsastringtoadress
是他们使用的。关于标准:声明:“地址是四个八位字节(32位)的固定长度。”。我没有找到关于“有效”地址的任何其他标准,因此我只能假设解析器行为特定于Windows:这就是为什么它被称为虚线“表示法”。192.168.1.1只是32位数字的一种表示(人类很容易记住)。任何32位数字都可以这样表示,而不仅仅是IP地址。谢谢您的建议。我将使用string.Contains查看字符串是否有“.”或“:”。我想会的work@corinne如果只使用
string.Contains
,还将允许使用类似
192.0
的地址。如果您想验证地址是否有四个八位字节,您可能需要做的不仅仅是一个
字符串。包含
。或者使用啊,是的。。这是真的@cubrr。谢谢你告诉我,lolI不得不对其进行一些修改,因为它不能处理像12.9这样的输入(正如cubrr提到的),但谢谢你:)它实际上并没有返回IP,并且它会破坏询问者提供的输入。@Chet Oh,我在问题中没有提到它,但我只需要它来打印“IPv4”、“IPv6”或“两者都没有”所以我把方法改为void。当我输入192时,我的程序没有中断,它返回false(如kraden的回答所示)或打印“两者都没有”。