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

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を使用しない必要があります。

于 2011-02-11T12:27:52.740 に答える
5

IPAddress.Parseは、IPv4の場合はドット付き4進表記、IPv6の場合はコロン16進表記のIPアドレスを含む文字列を取得することを目的としています。したがって、最初の例はIPv6で機能し、2番目の例はIPv4のポートをサポートしていないため失敗します。リンクhttp://msdn.microsoft.com/en-us/library/system.net.ipaddress.parse.aspx

于 2011-02-11T12:19:36.423 に答える
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 に答える