Reputation: 36205
I am currently working on a C# project where I need to validate the text that a user has entered into a text box.
One of the validations required is that it checks to ensure that an IP address has been entered correctly.
How would I go about doing this validation of the IP address.
Thanks for any help you can provide.
Upvotes: 6
Views: 11317
Reputation: 5804
Here's my solution:
using System.Net.NetworkInformation; using System.Net;
/// <summary>
/// Return true if the IP address is valid.
/// </summary>
/// <param name="address"></param>
/// <returns></returns>
public bool TestIpAddress (string address)
{
PingReply reply;
Ping pingSender = new Ping ();
try
{
reply = pingSender.Send (address);
}
catch (Exception)
{
return false;
}
return reply.Status == IPStatus.Success;
}
Upvotes: 0
Reputation: 4954
I'd use a regex.
^((25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)\.){3}(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)$
Using named groups, it could be clearer. It is written in Ruby. I don't know C# but I guess that the regex support is complete in that language and that named groups might exist.
/(?<number>(25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|\d)){0}^(\g<number>\.){3}\g<number>$/
Upvotes: 1
Reputation: 299
It seems that you are only concerned with validating IPv4 IP Address strings in X.X.X.X format. If so, this code is straight forward for that task:
string ip = "127.0.0.1";
string[] parts = ip.Split('.');
if (parts.Length < 4)
{
// not a IPv4 string in X.X.X.X format
}
else
{
foreach(string part in parts)
{
byte checkPart = 0;
if (!byte.TryParse(part, out checkPart))
{
// not a valid IPv4 string in X.X.X.X format
}
}
// it is a valid IPv4 string in X.X.X.X format
}
Upvotes: 5
Reputation: 113272
insta's answer was closer before he added the incorrect regexp.
public static bool IsValidIP(string ipAddress)
{
IPAddress unused;
return IPAddress.TryParse(ipAddress, out unused);
}
Or since the OP doesn't want to include integer IPv4 addresses that aren't full dotted quads:
public static bool IsValidIP(string ipAddress)
{
IPAddress unused;
return IPAddress.TryParse(ipAddress, out unused)
&&
(
unused.AddressFamily != AddressFamily.InterNetwork
||
ipAddress.Count(c => c == '.') == 3
);
}
Testing:
IsValidIP("fe80::202:b3ff:fe1e:8329")
returns true
(correct).
IsValidIP("127.0.0.1")
returns true
(correct).
IsValidIP("What's an IP address?")
returns false
(correct).
IsValidIP("127")
returns true
with first version, false
with second (correct).
IsValidIP("127.0")
returns true
with first version, false
with second (correct).
Upvotes: 1
Reputation: 4535
You can use IPAddress.Parse Method .NET Framework 1.1. Or, if you are using .NET 4.0, see documentation for IPAddress.TryParse Method .NET Framework 4.
This method determines if the contents of a string represent a valid IP address. In .NET 1.1, the return value is the IP address. In .NET 4.0, the return value indicates success/failure, and the IP address is returned in the IPAddress passed as an out
parameter in the method call.
edit: alright I'll play the game for bounty :) Here's a sample implementation as an extension method, requiring C# 3+ and .NET 4.0:
using System;
using System.Net;
using System.Text.RegularExpressions;
namespace IPValidator
{
class Program
{
static void Main (string[] args)
{
Action<string> TestIP = (ip) => Console.Out.WriteLine (ip + " is valid? " + ip.IsValidIP ());
TestIP ("99");
TestIP ("99.99.99.99");
TestIP ("255.255.255.256");
TestIP ("abc");
TestIP ("192.168.1.1");
}
}
internal static class IpExtensions
{
public static bool IsValidIP (this string address)
{
if (!Regex.IsMatch (address, @"\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b"))
return false;
IPAddress dummy;
return IPAddress.TryParse (address, out dummy);
}
}
}
Upvotes: 6
Reputation: 20620
If you want to see if the IP address actually exists, you can use the Ping class.
Upvotes: 1