regexはdangerousで、IPアドレスが使用できる形式が異なるため、IPアドレスを検証することができます。文字列がC#で有効なIPv4またはIPv6アドレスであるかどうかを調べる方法は?
私はCやC++のために同様の質問を見てきた、そしてそれらは、C#で、私は唯一の標準「ddd.dddを扱う見つけたinet_ntop()
.NETソリューションを存在しない機能で解決されました.ddd.ddd "という形式です。助言がありますか?
regexはdangerousで、IPアドレスが使用できる形式が異なるため、IPアドレスを検証することができます。文字列がC#で有効なIPv4またはIPv6アドレスであるかどうかを調べる方法は?
私はCやC++のために同様の質問を見てきた、そしてそれらは、C#で、私は唯一の標準「ddd.dddを扱う見つけたinet_ntop()
.NETソリューションを存在しない機能で解決されました.ddd.ddd "という形式です。助言がありますか?
あなたはそれを試してみて、解析するために、これを使用することができます。
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;
}
}
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
です。
System.Net.IpAddress.TryParse()
使用については単なる警告:
をあなたはそれTryParse機能が「0.0.0.3」であり、したがって、有効なInterNetworkV4アドレスに変換します(例えば「3」)の整数を含む文字列を渡した場合。したがって、最低でも、ユーザーの入力がどのように解釈されるかをユーザーが知るように、再フォーマットされた "0.0.0.3"をユーザーアプリケーションに戻す必要があります。
Unknown
, Dns
, IPv4
, IPv6
を返すSystem.Uri.CheckHostName(value)をチェックアウトできます。
if(Uri.CheckHostName(value) != UriHostNameType.Unknown)
//then 'value' is a valid IP address or hostname
このメソッドは、ユーザー入力が "192.169.1"でも有効なIP4アドレスを返します。ネットアドレスの最後のセットなし。 – alexandrudicu
あなたはIPAddress.GetAddressBytes()。Lengthプロパティを使用することができ
IPAddress someIP;
if (someIP.GetAddressBytes().Length == 4)
{
// IPV4
}
else (someIP.GetAddressBytes().Length == 16)
{
// IPV6
}
else
{
// Unknown
}
私は唯一の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に適用されるテストの組み合わせが..私の作品
/// <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;
}
問題ありません。あなたが知っているように、BCLは大規模です。私はそこに何があるかを見るために、毎回それを読むことを試みます。 –
このメソッドは、ユーザー入力が "192.169.1"でも有効なIP4アドレスを返します。 – alexandrudicu
はい、これは有効なIPアドレスであり、まさに正規表現経由で照合することによって元の質問者が意味するものは危険です... http:// stackoverflowを参照してください。tryparseの動作については、com/questions/12566664/ipaddress-tryparse-parses-192-168から192-0-0-168を参照してください。 – claudekennilol