IPAddress.Parseを使用して、IPアドレスとポートを含む文字列を解析しようとしています。これはIPv6アドレスではうまく機能しますが、IPv4アドレスでは機能しません。誰かがこれが起こる理由を説明できますか?
私が使用しているコードは次のとおりです。
IPAddress.Parse("[::1]:5"); //Valid
IPAddress.Parse("127.0.0.1:5"); //null
IPAddress.Parseを使用して、IPアドレスとポートを含む文字列を解析しようとしています。これはIPv6アドレスではうまく機能しますが、IPv4アドレスでは機能しません。誰かがこれが起こる理由を説明できますか?
私が使用しているコードは次のとおりです。
IPAddress.Parse("[::1]:5"); //Valid
IPAddress.Parse("127.0.0.1:5"); //null
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);
}
これは、ポートが IP アドレスの一部ではないために発生します。これは TCP/UDP に属しており、最初に取り除く必要があります。これには、Uri クラスが役立つ場合があります。
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を使用しない必要があります。
IPAddress.Parseは、IPv4の場合はドット付き4進表記、IPv6の場合はコロン16進表記のIPアドレスを含む文字列を取得することを目的としています。したがって、最初の例はIPv6で機能し、2番目の例はIPv4のポートをサポートしていないため失敗します。リンクhttp://msdn.microsoft.com/en-us/library/system.net.ipaddress.parse.aspx
古いバージョンの .net で作業している場合は、オープン ソースから IPEndPoint.Parse 実装を取得できます: https://github.com/dotnet/runtime/blob/main/src/libraries/System.Net.Primitives/src/System/ネット/IPEndPoint.cs