2009-04-28 13 views

risposta

107

È possibile utilizzare questo per cercare di analizzarlo:

IPAddress.TryParse 

Poi controllare AddressFamily che

ritorni System.Net.Sockets.AddressFamily.InterNetwork per IPv4 o System.Net.Sockets. AddressFamily.InterNetworkV6 per IPv6.

MODIFICA: alcuni esempi di codice. cambiare, se lo desideri:

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

Nessun problema. Il BCL è enorme, come sai. Cerco di leggerlo ogni tanto solo per vedere cosa c'è là fuori. –

+1

Questo metodo restituisce un indirizzo IP4 valido anche se l'input dell'utente è "192.169.1". – alexandrudicu

+2

Sì, perché è un indirizzo IP valido ed è esattamente ciò che il richiedente originale intendeva corrispondere tramite espressioni regolari è pericoloso ... Vedi questo post http: // StackOverflow.it/questions/12566664/ipaddress-tryparse-parses-192-168-to-192-0-0-168 per come funziona tryparse – claudekennilol

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

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

Se isValidIp è vero, è possibile controllare ipAddress.AddressFamily per determinare se si tratta di IPv4 o IPv6. È AddressFamily.InterNetwork per IPv4 e AddressFamily.InterNetworkV6 per IPv6.

26

Solo un avvertimento sull'utilizzo System.Net.IpAddress.TryParse():

Se si passa una stringa contenente un numero intero (ad esempio "3") la funzione TryParse verrà convertito in "0.0.0.3" e, quindi, di un indirizzo InterNetworkV4 valida . Quindi, per lo meno, il "0.0.0.3" riformattato deve essere restituito all'applicazione utente in modo che l'utente sappia come il loro input è stato interpretato.

0

È possibile utilizzare i IPAddress.GetAddressBytes(). La struttura Lunghezza

 IPAddress someIP; 

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

Credo che dovrebbe funzionare

2

Se non si vuole analizzare ogni intero, ma solo indirizzi IP, solo controllare . per IPv4 e : per 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 combinazione di test applicati a una stringa o IPAddress, lavora per me ..

 /// <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; 
    } 
Problemi correlati