如何确定字符串是否是C#中的有效IPv4或IPv6地址?

Jos*_*osh 67 .net c# ip-address

我知道正则表达式对于验证IP地址是危险的,因为IP地址可以采用不同的形式.

我见过类似的C和C++问题,这些问题是用C#inet_ntop()中不存在的函数解决的.

我发现的.NET解决方案只处理标准的"ddd.ddd.ddd.ddd"表单.有什么建议?

Eri*_*bal 138

您可以使用它来尝试解析它:

 IPAddress.TryParse
Run Code Online (Sandbox Code Playgroud)

然后检查AddressFamily

返回IPv4的System.Net.Sockets.AddressFamily.InterNetwork或IPv6的System.Net.Sockets.AddressFamily.InterNetworkV6.

编辑:一些示例代码.根据需要改变:

    string input = "your IP address goes here";

    IPAddress address;
    if (IPAddress.TryParse(input, out address))
    {
        switch (address.AddressFamily)
        {
            case System.Net.Sockets.AddressFamily.InterNetwork:
                // we have IPv4
                break;
            case System.Net.Sockets.AddressFamily.InterNetworkV6:
                // we have IPv6
                break;
            default:
                // umm... yeah... I'm going to need to take your red packet and...
                break;
        }
    }
Run Code Online (Sandbox Code Playgroud)

  • 没问题.如你所知,BCL是庞大的.我试着每隔一段时间仔细阅读一下,看看那里有什么. (4认同)
  • 即使用户输入为"192.169.1",此方法也会返回有效的IP4地址. (2认同)
  • 是的,因为这是一个有效的IP地址,正是原始提问者通过正则表达式匹配的意思是危险的...请参阅此帖子http://stackoverflow.com/questions/12566664/ipaddress-tryparse-parses-192-168- to-192-0-0-168关于tryparse如何工作 (2认同)

小智 29

只是警告使用System.Net.IpAddress.TryParse():

如果传递一个包含整数(例如"3")的字符串,TryParse函数会将其转换为"0.0.0.3",因此将其转换为有效的InterNetworkV4地址.因此,至少应该将重新格式化的"0.0.0.3"返回给用户应用程序,以便用户知道他们的输入是如何被解释的.


Tam*_*ege 14

string myIpString = "192.168.2.1";
System.Net.IPAddress ipAddress = null;

bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);
Run Code Online (Sandbox Code Playgroud)

如果isValidIp为true,您可以检查ipAddress.AddressFamily以确定它是IPv4还是IPv6.它AddressFamily.InterNetwork适用于IPv4和AddressFamily.InterNetworkV6IPv6.


Dan*_*iel 7

你可以检查出System.Uri.CheckHostName(值)返回Unknown,Dns,IPv4,IPv6.

if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
    //then 'value' is a valid IP address or hostname
Run Code Online (Sandbox Code Playgroud)

  • 即使用户输入为"192.169.1",此方法也会返回有效的IP4地址.没有最后一组网址. (2认同)
  • 很好,因为那是一个有效的IP地址. (2认同)

小智 6

如果您不想解析每个整数,而只想解析 IP,则只需检查 .IPv4 和:IPv6。

        if (input.Contains(".") || input.Contains(":"))
        {
            IPAddress address;
            if (IPAddress.TryParse(input, out address))
            {
                switch (address.AddressFamily)
                {
                    case AddressFamily.InterNetwork:
                        return Ip4Address;
                    case AddressFamily.InterNetworkV6:
                        return Ip6Address;
                }
            }
        }
Run Code Online (Sandbox Code Playgroud)