Лучший способ создать IPEndpoint из строки

С тех пор IPEndpoint содержит a ToString() метод, что выводы:

10.10.10.10:1010

Должен также быть Parse() и/или TryParse() метод, но нет.

Я могу разделить строку на : и проанализируйте IP-адрес и порт.

Но есть ли более изящный путь?

38
задан Baris Demiray 20 October 2016 в 14:11
поделиться

4 ответа

Создайте метод расширения Parse и TryParse. Думаю, это более элегантно.

1
ответ дан 27 November 2019 в 03:26
поделиться

Это одно из решений...

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);
}
31
ответ дан 27 November 2019 в 03:26
поделиться

Код синтаксического анализа для конечной точки IPv4 прост, но IPEndPoint.ToString () на IPv6-адресе также использует ту же нотацию двоеточия, но конфликтует с IPv6. запись адреса с двоеточием. Я надеялся, что Microsoft потратит усилия на написание этого уродливого кода синтаксического анализа, но, думаю, мне придется ...

1
ответ дан 27 November 2019 в 03:26
поделиться

Это будет работать с 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);
}
2
ответ дан 27 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: