2009-04-28 53 views

Respuesta

107

Usted puede usar esto para tratar de analizarlo:

IPAddress.TryParse 

A continuación, compruebe el cual AddressFamily

devoluciones System.Net.Sockets.AddressFamily.InterNetwork para IPv4 o System.Net.Sockets. AddressFamily.InterNetworkV6 para IPv6.

EDIT: algunos código de muestra. cambiar la forma deseada:

string input = "your IP address goes here"; 

    IPAddress address; 
    if (IPAddress.TryParse(input, out address)) 
    { 
     switch (address.AddressFamily) 
     { 
      case System.Net.Sockets.AddressFamily.InterNetwork: 
       // we have IPv4 
       break; 
      case System.Net.Sockets.AddressFamily.InterNetworkV6: 
       // we have IPv6 
       break; 
      default: 
       // umm... yeah... I'm going to need to take your red packet and... 
       break; 
     } 
    } 
+4

No hay problema. El BCL es masivo, como sabes. Intento leerlo de vez en cuando solo para ver qué hay ahí afuera. –

+1

Este método devuelve una dirección IP4 válida incluso si la entrada del usuario es "192.169.1". – alexandrudicu

+2

Sí, porque esa es una dirección IP válida y es exactamente lo que el asker original quiso decir emparejando a través de regex es peligroso ... Ver esta publicación http: // stackoverflow.com/questions/12566664/ipaddress-tryparse-parses-192-168-to-192-0-0-168 para saber cómo funciona tryparse – claudekennilol

12
string myIpString = "192.168.2.1"; 
System.Net.IPAddress ipAddress = null; 

bool isValidIp = System.Net.IPAddress.TryParse(myIpString, out ipAddress); 

Si isValidIp es cierto, se puede comprobar ipAddress.AddressFamily para determinar si se trata de IPv4 o IPv6. Es AddressFamily.InterNetwork para IPv4 y AddressFamily.InterNetworkV6 para IPv6.

26

Sólo una advertencia sobre el uso de System.Net.IpAddress.TryParse():

Si se le pasa una cadena que contiene un entero (por ejemplo, "3") la función TryParse lo convertirá en "0.0.0.3" y, por lo tanto, una dirección válida InterNetworkV4 . Por lo tanto, como mínimo, el "0.0.0.3" reformateado debe devolverse a la aplicación del usuario para que el usuario sepa cómo se interpretó su entrada.

0

Es posible utilizar los IPAddress.GetAddressBytes(). Propiedad Length

 IPAddress someIP; 

     if (someIP.GetAddressBytes().Length == 4) 
     { 
      // IPV4 
     } 
     else (someIP.GetAddressBytes().Length == 16) 
     { 
      // IPV6 
     } 
     else 
     { 
      // Unknown 
     } 

supongo que debería funcionar

2

Si no desea analizar cada número entero, pero sólo IPs, sólo marque . para IPv4 y : para IPv6.

 if (input.Contains(".") || input.Contains(":")) 
     { 
      IPAddress address; 
      if (IPAddress.TryParse(input, out address)) 
      { 
       switch (address.AddressFamily) 
       { 
        case AddressFamily.InterNetwork: 
         return Ip4Address; 
        case AddressFamily.InterNetworkV6: 
         return Ip6Address; 
       } 
      } 
     } 
0

Una combinación de pruebas aplicadas a una cadena o Dirección IP, funciona para mí ..

 /// <summary> 
    /// Test string for valid ip address format 
    /// </summary> 
    /// 
    /// <param name="Address">The ip address string</param> 
    /// 
    /// <returns>Returns true if address is a valid format</returns> 
    public static bool IsValidIP(IPAddress Ip) 
    { 
     byte[] addBytes = Ip.GetAddressBytes(); 

     switch (Ip.AddressFamily) 
     { 
      case AddressFamily.InterNetwork: 
       if (addBytes.Length == 4) 
        return true; 
       break; 
      case AddressFamily.InterNetworkV6: 
       if (addBytes.Length == 16) 
        return true; 
       break; 
      default: 
       break; 
     } 

     return false; 
    } 

    /// <summary> 
    /// Test string for valid ip address format 
    /// </summary> 
    /// 
    /// <param name="Address">The ip address string</param> 
    /// 
    /// <returns>Returns true if address is a valid format</returns> 
    public static bool IsValidIP(string Address) 
    { 
     IPAddress ip; 
     if (IPAddress.TryParse(Address, out ip)) 
     { 
      switch (ip.AddressFamily) 
      { 
       case System.Net.Sockets.AddressFamily.InterNetwork: 
        if (Address.Length > 6 && Address.Contains(".")) 
        { 
         string[] s = Address.Split('.'); 
         if (s.Length == 4 && s[0].Length > 0 && s[1].Length > 0 && s[2].Length > 0 && s[3].Length > 0) 
          return true; 
        } 
        break; 
       case System.Net.Sockets.AddressFamily.InterNetworkV6: 
        if (Address.Contains(":") && Address.Length > 15) 
         return true; 
        break; 
       default: 
        break; 
      } 
     } 

     return false; 
    } 
Cuestiones relacionadas