IPAddress no es IP + puerto. Desea IPEndPoint.
Ejemplo 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);
}
}
}
Editar: Ok, voy a admitir que no era la solución más elegante. Prueba con esto que escribí (sólo para usted) en su lugar:
// 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));
}
Tenga en cuenta que éste acepta sólo la dirección IP, nombre de host no. Si desea dar soporte al nombre de host, tendrá que resolverlo en IP o no usar IPAddress/IPEndPoint.
Aquí no obtienen un valor nulo para el segundo ejemplo. Obtengo una excepción Una dirección IPv4 no incluye números de puerto. Tenga en cuenta que está tratando de analizar una cadena que contenga "una dirección IP * y * un puerto". Entonces la excepción tiene sentido. Por qué funciona la versión IPv6, no sé. –
'IPAddress.Parse (" [:: 1]: 5 ");' es válido, * pero * el ': 5' se elimina silenciosamente! Si inspecciona el objeto resultante, puede ver que el resultado es simplemente ':: 1'. Esto podría ser un error en el método 'IPAddress.Parse' ... – hangy
@Martinho Fernandes - no es un error en el analizador IP6, [:: 1]: 5 es una dirección IP6 válida porque el separador es ':' , no '::' (http://tools.ietf.org/html/draft-ietf-6man-text-addr-representation-04#section-4) - ** y ** la combinación de puertos está integrada en el IP6 especificación también, sin embargo, no se espera que la entidad IPAddress * contenga * el puerto. Es posible que [a, b, c, d]: port para ipv4 también esté permitido ya que la especificación IP6 parece sugerir que era parte de la especificación IP4 –