2015-11-11 115 views
2

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

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"); 
} 
+1

是什么让你觉得'192'不是一个有效的IP地址? – DavidG

+0

'IPAddress.Parse'似乎以'ping.exe'类似的方式解析地址 - 请参阅此超级用户有关其他有效IP地址表示的答案:http://superuser.com/a/486936/270560 – cubrr

+0

@cubrr Most可能是因为它使用了也可能符合(IETF?)标准的相同底层代码。 – DavidG

回答

2

您可以使用下面的代码来验证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将返回InterNetworkIPv4InterNetworkV6IPv6

+0

我不得不修改这一点,因为它不像12.9输入(如cubrr提到的),但谢谢你:) – corinne

+0

它实际上并没有返回IP,它提供者提供的输入中断。 – Chet

+0

@Chet哦,我没有在我的问题中提到它,但我只是需要它来打印“IPv4”,“IPv6”或“都不是”,所以我改变了方法为void。当我输入192时,我的程序没有中断,它返回false(如克拉登的回答中所见)或打印“都不是”。 – corinne

0

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

如果你看一下this页面的备注部分,你会看到我在说什么。

0

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

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

+0

谢谢您的建议。我将使用string.Contains来查看该字符串是否有“。”要么 ”:”。我认为这将起作用 – corinne

+0

@corinne如果你只是使用'string.Contains',你也会允许一个像'192.0'这样的地址。如果你的意思是验证这个地址是否有四个八位字节,你可能想要做的不仅仅是一个'string.Contains'。 – cubrr

+0

或使用[正则表达式](http://stackoverflow.com/questions/10006459/regular-expression-for-ip-address-validation) – DavidG