82

IPアドレスはさまざまな形式をとることができるため、正規表現はIPアドレスの検証にとって危険であることを私は知っています。

私はCとC++について同様の質問を見てきましたが、それらはC# inet_ntop()に存在しない関数で解決されました。

私が見つけた.NETソリューションは、標準の「ddd.ddd.ddd.ddd」形式のみを処理します。助言がありますか?

4

7 に答える 7

162

これを使用して、解析を試みることができます。

 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;
        }
    }
于 2009-04-28T17:40:22.600 に答える
34

使用に関する警告System.Net.IpAddress.TryParse()

整数(「3」など)を含む文字列を渡すと、TryParse関数はそれを「0.0.0.3」に変換するため、有効なInterNetworkV4アドレスに変換されます。したがって、少なくとも、再フォーマットされた「0.0.0.3」をユーザーアプリケーションに返して、ユーザーが入力がどのように解釈されたかを知る必要があります。

于 2011-04-01T14:53:03.603 に答える
19
string myIpString = "192.168.2.1";
System.Net.IPAddress ipAddress = null;

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

isValidIptrueの場合、IPv4かIPv6かを確認できますipAddress.AddressFamilyAddressFamily.InterNetworkIPv4用とIPv6AddressFamily.InterNetworkV6用です。

于 2009-04-28T17:45:34.850 に答える
7

、、、返すSystem.Uri.CheckHostName(value)チェックアウトできます。 UnknownDnsIPv4IPv6

if( Uri.CheckHostName( value ) != UriHostNameType.Unknown)
    //then 'value' is a valid IP address or hostname
于 2012-02-13T22:59:19.310 に答える
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;
                }
            }
        }
于 2014-12-12T10:09:43.283 に答える
1

IPAddress.GetAddressBytes()。Lengthプロパティを使用できます

        IPAddress someIP;

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

私はうまくいくはずだと思います

于 2013-04-08T13:59:07.570 に答える
1

文字列またはIPアドレスに適用されるテストの組み合わせは、私にとってはうまくいきます。

        /// <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;
    }
于 2015-09-21T18:26:16.970 に答える