IPAddress.Parse () используя порт на IPv4 - PullRequest
12 голосов
/ 11 февраля 2011

Я пытаюсь проанализировать строку, содержащую IP-адрес и порт, используя IPAddress.Parse. Это хорошо работает с адресами IPv6, но не с адресами IPv4. Может ли кто-нибудь объяснить, почему это происходит?

Код, который я использую:

IPAddress.Parse("[::1]:5"); //Valid
IPAddress.Parse("127.0.0.1:5"); //null

Ответы [ 4 ]

21 голосов
/ 11 февраля 2011
Uri url;
IPAddress ip;
if (Uri.TryCreate(String.Format("http://{0}", "127.0.0.1:5"), UriKind.Absolute, out url) &&
   IPAddress.TryParse(url.Host, out ip))
{
    IPEndPoint endPoint = new IPEndPoint(ip, url.Port);
}
11 голосов
/ 11 февраля 2011

Это происходит потому, что порт не является частью IP-адреса. Он принадлежит TCP / UDP, и вам придется сначала его удалить. Класс Uri может быть полезен для этого.

7 голосов
/ 11 февраля 2011

IP-адрес не является IP + порт.Вы хотите IPEndPoint.

Пример из http://www.java2s.com/Code/CSharp/Network/ParseHostString.htm

public static void ParseHostString(string hostString, ref string hostName, ref int port)
{
   hostName = hostString;
   if (hostString.Contains(":"))
   {
      string[] hostParts = hostString.Split(':');

      if (hostParts.Length == 2)
      {
         hostName = hostParts[0];
         int.TryParse(hostParts[1], out port);
      }
   }
}

Редактировать: Хорошо, я признаю, что это было не самое элегантное решение.Попробуйте этот вариант, который я написал (только для вас):

// You need to include some usings:
using System.Text.RegularExpressions;
using System.Net;

// Then this code (static is not required):
private static Regex hostPortMatch = new Regex(@"^(?<ip>(?:\[[\da-fA-F:]+\])|(?:\d{1,3}\.){3}\d{1,3})(?::(?<port>\d+))?$", System.Text.RegularExpressions.RegexOptions.Compiled);
public static IPEndPoint ParseHostPort(string hostPort)
{
   Match match = hostPortMatch.Match(hostPort);
   if (!match.Success)
      return null;

   return new IPEndPoint(IPAddress.Parse(match.Groups["ip"].Value), int.Parse(match.Groups["port"].Value));
}

Обратите внимание, что он принимает только IP-адрес, а не имя хоста.Если вы хотите поддерживать имя хоста, вам придется разрешить его в IP или не использовать IPAddress / IPEndPoint.

5 голосов
/ 11 февраля 2011

IPAddress.Parse предназначен для получения строки, которая содержит IP-адрес в четырехточечной нотации для IPv4 и в шестнадцатеричной системе счисления для IPv6. Таким образом, ваш первый пример работает для IPv6, а второй - не работает, потому что он не поддерживает порт для IPv4. Ссылка http://msdn.microsoft.com/en-us/library/system.net.ipaddress.parse.aspx

...