Vraag IPAddress.Parse () met behulp van poort op IPv4


Ik probeer een string te analyseren die een IP-adres en een poort bevat met behulp van IPAddress.Parse. Dit werkt goed met IPv6-adressen, maar niet met IPv4-adressen. Kan iemand uitleggen waarom dit gebeurt?

De code die ik gebruik is:

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

11
2018-02-11 12:07


oorsprong


antwoorden:


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

19
2018-02-11 12:36



Dit gebeurt omdat de poort geen deel uitmaakt van het IP-adres. Het hoort bij TCP / UDP en je zult het eerst moeten verwijderen. De Uri-klasse kan hiervoor nuttig zijn.


9
2018-02-11 12:23



IP-adres is geen IP + poort. U wilt IPEndPoint.

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

Bewerken: Oké, ik geef toe dat dit niet de meest elegante oplossing was. Probeer deze die ik schreef (alleen voor jou) in plaats daarvan:

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

Merk op dat deze ALLEEN een IP-adres accepteert, geen hostnaam. Als u de hostnaam wilt ondersteunen, moet u deze oplossen naar IP of IPAddress / IPEndPoint niet gebruiken.


6
2018-02-11 12:27



IPAddress.Parse is bedoeld om een ​​string te nemen die een IP-adres bevat in de gestippelde quad-notatie voor IPv4 en in de colon-hexadecimale notatie voor IPv6. Dus je eerste voorbeeld werkt voor IPv6 en je tweede voorbeeld mislukt omdat het geen poort voor IPv4 ondersteunt. Link http://msdn.microsoft.com/en-us/library/system.net.ipaddress.parse.aspx


5
2018-02-11 12:19