Question

J'essaie d'analyser une chaîne contenant une adresse IP et un port utilisant iPaddress.parse. Cela fonctionne bien avec les adresses IPv6 mais pas avec les adresses IPv4. Somone peut-il expliquer pourquoi cela se produit?

Le code que j'utilise est:

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

Pas de solution correcte

Autres conseils

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);
}

Cela se produit parce que le port ne fait pas partie de l'adresse IP. Il appartient à TCP / UDP, et vous devrez d'abord le supprimer. La classe URI pourrait être utile pour cela.

IPaddress n'est pas le port IP +. Vous voulez ipeendpoint.

Exemple de 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);
      }
   }
}

Edit: OK, je vais admettre que ce n'était pas la solution la plus élégante. Essayez celui-ci que j'ai écrit (juste pour vous) à la place:

// 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));
}

Notez que celui-ci accepte uniquement l'adresse IP, pas le nom d'hôte. Si vous souhaitez prendre en charge le nom d'hôte, vous devrez soit le résoudre sur IP ou ne pas utiliser iPaddress / iPendpoint.

IPaddress.parse est destiné à prendre une chaîne qui contient une adresse IP en notation de quad en pointillés pour IPv4 et dans la notation du colon-hexadécimal pour IPv6. Ainsi, votre premier exemple fonctionne pour IPv6 et votre deuxième exemple échoue car il ne prend pas en charge un port pour IPv4. Lien http://msdn.microsoft.com/en-us/library/system.net.ipaddress.parse.aspx

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top