13

我正在尝试使用 IPAddress.Parse 解析包含 IP 地址和端口的字符串。这适用于 IPv6 地址,但不适用于 IPv4 地址。有人可以解释为什么会这样吗?

我正在使用的代码是:

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

6 回答 6

23
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);
}
于 2011-02-11T12:36:29.217 回答
11

发生这种情况是因为端口不是 IP 地址的一部分。它属于 TCP/UDP,您必须先将其剥离。Uri 类可能对此有所帮助。

于 2011-02-11T12:23:25.573 回答
7

IPAddress 不是 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。

于 2011-02-11T12:27:52.740 回答
5

IPAddress.Parse 旨在采用一个字符串,该字符串包含 IPv4 的点分四进制表示法和 IPv6 的冒号十六进制表示法的 IP 地址。因此,您的第一个示例适用于 IPv6,而您的第二个示例失败,因为它不支持 IPv4 端口。链接http://msdn.microsoft.com/en-us/library/system.net.ipaddress.parse.aspx

于 2011-02-11T12:19:36.423 回答
0

正如 Tedd Hansen 指出的那样,您要解析的不是 IP 地址,而是 IP 端点(IP 地址 + 端口)。从 .NET Core 3.0 开始,您可以使用IPEndPoint.TryParse将字符串解析为 IPEndPoint:

if (IPEndPoint.TryParse("127.0.0.1:5", out IPEndPoint endpoint))
{
    // parsed successfully, you can use the "endpoint" variable
    Console.WriteLine(endpoint.Address.ToString()); // writes "127.0.0.1"
    Console.WriteLine(endpoint.Port.ToString()); // writes "5"
}
else
{
    // failed to parse
}
于 2021-05-14T11:24:00.190 回答
0

如果您使用旧版本的 .net,您可以从开源获取 IPEndPoint.Parse 实现:https ://github.com/dotnet/runtime/blob/main/src/libraries/System.Net.Primitives/src/System/网络/IPEndPoint.cs

于 2021-12-15T14:10:52.047 回答