Programing

문자열이 C #에서 유효한 IPv4 또는 IPv6 주소인지 확인하는 방법은 무엇입니까?

crosscheck 2020. 11. 13. 07:49
반응형

문자열이 C #에서 유효한 IPv4 또는 IPv6 주소인지 확인하는 방법은 무엇입니까?


정규식은 IP 주소가 취할 수있는 다른 형식 때문에 IP 주소를 확인하는 데 위험하다는 것을 알고 있습니다.

C 및 C ++에 대한 유사한 질문을 보았고 C # inet_ntop () 에없는 함수로 해결되었습니다.

내가 찾은 .NET 솔루션은 표준 "ddd.ddd.ddd.ddd"형식 만 처리합니다. 어떤 제안?


이것을 사용하여 시도하고 구문 분석 할 수 있습니다.

 IPAddress.TryParse

그리고 확인 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;
        }
    }

사용에 대한 경고 System.Net.IpAddress.TryParse():

정수 (예 : "3")를 포함하는 문자열을 전달하면 TryParse 함수는이를 "0.0.0.3"으로 변환하므로 유효한 InterNetworkV4 주소가됩니다. 따라서 최소한 재 포맷 된 "0.0.0.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.InterNetworkIPv4에서와 AddressFamily.InterNetworkV6IPv6를 위해.


당신은 체크 아웃 할 수 System.Uri.CheckHostName (값) 반환을 Unknown, Dns, IPv4,IPv6 .

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

모든 정수를 구문 분석하지 않고 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;
                }
            }
        }

IPAddress.GetAddressBytes (). Length 속성을 사용할 수 있습니다.

        IPAddress someIP;

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

작동해야 할 것 같아요


A combination of tests applied to a string or IPAddress, works for me..

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

참고URL : https://stackoverflow.com/questions/799060/how-to-determine-if-a-string-is-a-valid-ipv4-or-ipv6-address-in-c

반응형