2009-04-28 11 views
54

regexはdangerousで、IPアドレスが使用できる形式が異なるため、IPアドレスを検証することができます。文字列がC#で有効なIPv4またはIPv6アドレスであるかどうかを調べる方法は?

私はCやC++のために同様の質問を見てきた、そしてそれらは、C#で、私は唯一の標準「ddd.dddを扱う見つけたinet_ntop()

.NETソリューションを存在しない機能で解決されました.ddd.ddd "という形式です。助言がありますか?

答えて

107

あなたはそれを試してみて、解析するために、これを使用することができます。

IPAddress.TryParse 

次に、IPv4またはSystem.Net.SocketsためSystem.Net.Sockets.AddressFamily.InterNetwork AddressFamily

戻り値を確認してください。 IPv6用のAddressFamily.InterNetworkV6。

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

問題ありません。あなたが知っているように、BCLは大規模です。私はそこに何があるかを見るために、毎回それを読むことを試みます。 –

+1

このメソッドは、ユーザー入力が "192.169.1"でも有効なIP4アドレスを返します。 – alexandrudicu

+2

はい、これは有効なIPアドレスであり、まさに正規表現経由で照合することによって元の質問者が意味するものは危険です... http:// stackoverflowを参照してください。tryparseの動作については、com/questions/12566664/ipaddress-tryparse-parses-192-168から192-0-0-168を参照してください。 – claudekennilol

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

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

真であるisValidIp場合、あなたはそれがIPv4またはIPv6のかどうかを決定するためにipAddress.AddressFamilyを確認することができます。 IPv4の場合はAddressFamily.InterNetwork、IPv6の場合はAddressFamily.InterNetworkV6です。

26

System.Net.IpAddress.TryParse()使用については単なる警告:

をあなたはそれTryParse機能が「0.0.0.3」であり、したがって、有効なInterNetworkV4アドレスに変換します(例えば「3」)の整数を含む文字列を渡した場合。したがって、最低でも、ユーザーの入力がどのように解釈されるかをユーザーが知るように、再フォーマットされた "0.0.0.3"をユーザーアプリケーションに戻す必要があります。

6

Unknown , Dns, IPv4, IPv6を返すSystem.Uri.CheckHostName(value)をチェックアウトできます。

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

このメソッドは、ユーザー入力が "192.169.1"でも有効なIP4アドレスを返します。ネットアドレスの最後のセットなし。 – alexandrudicu

0

あなたはIPAddress.GetAddressBytes()。Lengthプロパティを使用することができ

 IPAddress someIP; 

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

私は唯一のIPアドレス、ちょうどあなたがすべての整数を解析したくない場合は

2

を動作するはずと思いますが、 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; 
       } 
      } 
     } 
0

文字列またはた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; 
    } 
関連する問題