IPAddress.TryParse返回不期望的结果

3

我有一个函数,使用IPAddress类返回给定IP地址是否有效。我进行了测试,即使我传递没有点的"0123456"或"11111"或"99999"作为参数,它也会返回有效(true)。我用VB.net和C#编写了它,结果相同。

// C#
public bool CheckIpAddress(string ipAddr)
{
    IPAddress ip = null;
    return IPAddress.TryParse(ipAddr,out ip);
}

  // VB.net
  Public Function CheckIpAddress(ipAddr As String) As Boolean
        Dim ip As IPAddress = Nothing

        Return Net.IPAddress.TryParse(ipAddr, ip)
    End Function

有人能解释一下为什么会发生这种情况吗?我已经与互联网上的一些资源匹配了我的代码,应该没有问题。

3个回答

9
IP地址只是一个32位的数字,所以11111绝对是正确的IP地址。IP地址中的点只是为了方便人类阅读而存在,没有必要。

IP地址是二进制数,但它们通常以文本文件形式存储并以人类可读的符号表示,例如172.16.254.1(对于IPv4)和2001:db8:0:1234:0:567:8:1(对于IPv6)。

摘自IP地址-Wikipedia

这就是为什么IPAddress.TryParse会返回true

MSDN上甚至有描述:IPAddress.Parse方法

ipString中的部件数量(每个部件由句点分隔)确定如何构造IP地址。单个部件地址直接存储在网络地址中。 两个部件地址方便指定A类地址,将前导部分放在第一个字节中,并将尾随部分放在网络地址的最右边三个字节中。三个部件地址方便指定B类地址,将第一部分放在第一个字节中,将第二部分放在第二个字节中,并将最后一部分放在网络地址的最右边两个字节中。

这里还有一个示例(请参见第一个示例):

1 -- "65536"       0.0.255.255
2 -- "20.2"        20.0.0.2
2 -- "20.65535"    20.0.255.255
3 -- "128.1.2"     128.1.0.2

我知道IP地址是如何构成的,正确的格式等等。11111不是一个有效的IP地址,1.1.1.1是有效的。所以你告诉我的是这个方法(tryParse)只检查每个8位部分吗?为什么用999返回true? - user3477273
1
“11111” 是一个有效的IP地址,因为它适合32位数字。IP地址中的点只是为了使人类更容易阅读地址而存在,并不意味着它们是必需的。从维基百科:IP地址是二进制数,但通常存储在文本文件中并以人类可读的符号表示,例如172.16.254.1(对于IPv4)和2001:db8:0:1234:0:567:8:1(对于IPv6)。 - MarcinJuraszek
有没有其他类可以检查可读的 IP 地址格式? - user3477273
我不知道有没有现成的,但你应该很容易自己编写这样的功能。 - MarcinJuraszek

2

如果你想根据模式进行验证,应该使用正则表达式。以下代码可能会有所帮助:

 Match match = Regex.Match(input, @"^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$");
 if (match.Success)
 {
     Console.WriteLine("It is a valid IP Address");
 }

1
由于它有一个vb.net标签
Public Function CheckIpAddress(ipAddr As String) As Boolean
    Dim parts() As String = ipAddr.Split(New Char() {"."c}, StringSplitOptions.RemoveEmptyEntries)
    Dim rv As Boolean
    If parts.Length <> 4 Then
        rv = False
    Else
        Dim anIP As Net.IPAddress
        If Net.IPAddress.TryParse(ipAddr, anIP) Then
            rv = True
        Else
            rv = False
        End If
    End If
    Return rv
End Function

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接