Подтвердить что ты не робот

Как определить, является ли строка допустимым адресом IPv4 или IPv6 в С#?

Я знаю, что regex опасно для проверки IP-адресов из-за различных форм, которые может принимать IP-адрес.

Я видел похожие вопросы для C и С++, и они были решены с помощью функции, которая не существует в С# inet_ntop()

Решения .NET, которые я нашел, обрабатывают только стандартную форму "ddd.ddd.ddd.ddd". Любые предложения?

4b9b3361

Ответ 1

Вы можете использовать это, чтобы попытаться разобрать его:

 IPAddress.TryParse

Затем проверьте AddressFamily, который

Возвращает System.Net.Sockets.AddressFamily.InterNetwork для IPv4 или System.Net.Sockets.AddressFamily.InterNetworkV6 для IPv6.

EDIT: некоторый пример кода. по желанию:

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

Ответ 2

Просто предупреждение об использовании System.Net.IpAddress.TryParse():

Если вы передадите ему строку, содержащую целое число (например, "3" ), функция TryParse преобразует ее в "0.0.0.3" и, следовательно, действительный адрес InterNetworkV4. Итак, по крайней мере, переформатированный "0.0.0.3" должен быть возвращен в пользовательское приложение, чтобы пользователь знал, как интерпретируется их ввод.

Ответ 3

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

bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress);

Если значение isValidIp истинно, вы можете проверить ipAddress.AddressFamily, чтобы определить, является ли он IPv4 или IPv6. Он AddressFamily.InterNetwork для IPv4 и AddressFamily.InterNetworkV6 для IPv6.

Ответ 5

Если вы не хотите анализировать каждое целое число, но только 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;
                }
            }
        }

Ответ 6

Вы можете использовать свойство IPAddress.GetAddressBytes(). Свойство длины

        IPAddress someIP;

        if (someIP.GetAddressBytes().Length == 4)
        {
            // IPV4
        }
        else (someIP.GetAddressBytes().Length == 16)
        {
            // IPV6
        }
        else
        {
            // Unknown
        }

Я думаю, должен работать

Ответ 7

Комбинация тестов, применяемых к строке или IPAddress, работает для меня.

        /// <summary>
    /// Test string for valid ip address format
    /// </summary>
    /// 
    /// <param name="Address">The ip address string</param>
    /// 
    /// <returns>Returns true if address is a valid format</returns>
    public static bool IsValidIP(IPAddress Ip)
    {
        byte[] addBytes = Ip.GetAddressBytes();

        switch (Ip.AddressFamily)
        {
            case AddressFamily.InterNetwork:
                if (addBytes.Length == 4)
                    return true;
                break;
            case AddressFamily.InterNetworkV6:
                if (addBytes.Length == 16)
                    return true;
                break;
            default:
                break;
        }

        return false;
    }

    /// <summary>
    /// Test string for valid ip address format
    /// </summary>
    /// 
    /// <param name="Address">The ip address string</param>
    /// 
    /// <returns>Returns true if address is a valid format</returns>
    public static bool IsValidIP(string Address)
    {
        IPAddress ip;
        if (IPAddress.TryParse(Address, out ip))
        {
            switch (ip.AddressFamily)
            {
                case System.Net.Sockets.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 System.Net.Sockets.AddressFamily.InterNetworkV6:
                    if (Address.Contains(":") && Address.Length > 15)
                        return true;
                    break;
                default:
                    break;
            }
        }

        return false;
    }