С тех пор IPEndpoint
содержит a ToString()
метод, что выводы:
10.10.10.10:1010
Должен также быть Parse()
и/или TryParse()
метод, но нет.
Я могу разделить строку на :
и проанализируйте IP-адрес и порт.
Но есть ли более изящный путь?
Создайте метод расширения Parse и TryParse. Думаю, это более элегантно.
Это одно из решений...
public static IPEndPoint CreateIPEndPoint(string endPoint)
{
string[] ep = endPoint.Split(':');
if(ep.Length != 2) throw new FormatException("Invalid endpoint format");
IPAddress ip;
if(!IPAddress.TryParse(ep[0], out ip))
{
throw new FormatException("Invalid ip-adress");
}
int port;
if(!int.TryParse(ep[1], NumberStyles.None, NumberFormatInfo.CurrentInfo, out port))
{
throw new FormatException("Invalid port");
}
return new IPEndPoint(ip, port);
}
Edit: Добавлена версия, которая будет работать с IPv4 и IPv6, предыдущая версия работает только с IPv4.
// Handles IPv4 and IPv6 notation.
public static IPEndPoint CreateIPEndPoint(string endPoint)
{
string[] ep = endPoint.Split(':');
if (ep.Length < 2) throw new FormatException("Invalid endpoint format");
IPAddress ip;
if (ep.Length > 2)
{
if (!IPAddress.TryParse(string.Join(":", ep, 0, ep.Length - 1), out ip))
{
throw new FormatException("Invalid ip-adress");
}
}
else
{
if (!IPAddress.TryParse(ep[0], out ip))
{
throw new FormatException("Invalid ip-adress");
}
}
int port;
if (!int.TryParse(ep[ep.Length - 1], NumberStyles.None, NumberFormatInfo.CurrentInfo, out port))
{
throw new FormatException("Invalid port");
}
return new IPEndPoint(ip, port);
}
Код синтаксического анализа для конечной точки IPv4 прост, но IPEndPoint.ToString () на IPv6-адресе также использует ту же нотацию двоеточия, но конфликтует с IPv6. запись адреса с двоеточием. Я надеялся, что Microsoft потратит усилия на написание этого уродливого кода синтаксического анализа, но, думаю, мне придется ...
Это будет работать с IPv4 и IPv6. Метод расширения для этой функции будет в System.string. Не уверен, что мне нужна эта опция для каждой строки в проекте.
private static IPEndPoint IPEndPointParse(string endpointstring)
{
string[] values = endpointstring.Split(new char[] {':'});
if (2 > values.Length)
{
throw new FormatException("Invalid endpoint format");
}
IPAddress ipaddress;
string ipaddressstring = string.Join(":", values.Take(values.Length - 1).ToArray());
if (!IPAddress.TryParse(ipaddressstring, out ipaddress))
{
throw new FormatException(string.Format("Invalid endpoint ipaddress '{0}'", ipaddressstring));
}
int port;
if (!int.TryParse(values[values.Length - 1], out port)
|| port < IPEndPoint.MinPort
|| port > IPEndPoint.MaxPort)
{
throw new FormatException(string.Format("Invalid end point port '{0}'", values[values.Length - 1]));
}
return new IPEndPoint(ipaddress, port);
}