2009-04-28 8 views
54

मुझे पता है कि आईपी पते को अलग-अलग रूपों के कारण आईपी पते को मान्य करने के लिए रीगेक्स dangerous है।यह निर्धारित करने के लिए कि कोई स्ट्रिंग सी # में एक वैध आईपीवी 4 या आईपीवी 6 पता है या नहीं?

मैं C और C++ के लिए इसी तरह के सवाल को देखा है, और उन एक समारोह है कि सी # में inet_ntop()

नेट समाधान मैं केवल मानक "ddd.ddd संभाल पाया है मौजूद नहीं है के साथ हल किया गया .ddd.ddd "फॉर्म। कोई सुझाव?

उत्तर

107

आप कोशिश करते हैं और यह पार्स करने के लिए इस का उपयोग कर सकते हैं:

IPAddress.TryParse 

फिर आईपीवी 4 या System.Net.Sockets के लिए जाँच AddressFamily जो

रिटर्न System.Net.Sockets.AddressFamily.InterNetwork। IPF6 के लिए AddressFamily.InterNetworkV6।

संपादित करें: कुछ नमूना कोड। बदलने के रूप में वांछित:

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

कोई बात नहीं। जैसा कि आप जानते हैं, बीसीएल भारी है। मैं बस कुछ समय में इसे देखने की कोशिश करता हूं कि यह देखने के लिए कि वहां क्या है। –

+1

यह विधि एक वैध आईपी 4 पता देता है भले ही उपयोगकर्ता इनपुट "1 9 .1.169.1" है। – alexandrudicu

+2

हां, क्योंकि यह एक वैध आईपी पता है और वास्तव में रेगेक्स के माध्यम से मिलान करके मूल पूछताछ का मतलब खतरनाक है ... इस पोस्ट को http: // stackoverflow देखें।com/प्रश्न/12566664/ipaddress-tryparse-parses-192-168-to-192-0-0-168 कैसे tryparse काम करता है – claudekennilol

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

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

तो isValidIp सच है, आप देख सकते हैं कि यह आईपीवी 4 या आईपीवी 6 है ipAddress.AddressFamily निर्धारित करने के लिए। IPv4 के लिए यह AddressFamily.InterNetwork और AddressFamily.InterNetworkV6 आईपीवी 6 के लिए है।

26

System.Net.IpAddress.TryParse() उपयोग के बारे में बस एक चेतावनी:

आप इसे एक स्ट्रिंग (उदाहरण के लिए "3") एक पूर्णांक युक्त TryParse समारोह इसे करने के लिए "0.0.0.3" और इसलिए, एक वैध InterNetworkV4 पते में परिवर्तित कर देंगे पार कर लेते हैं । इसलिए, कम से कम, सुधारित "0.0.0.3" को उपयोगकर्ता अनुप्रयोग में वापस किया जाना चाहिए ताकि उपयोगकर्ता जानता है कि उनके इनपुट का अर्थ कैसे लिया गया था।

6

आप System.Uri.CheckHostName(value) देख सकते हैं जो Unknown , Dns, IPv4, IPv6 देता है।

if(Uri.CheckHostName(value) != UriHostNameType.Unknown) 
    //then 'value' is a valid IP address or hostname 
+2

यह विधि एक वैध आईपी 4 पता देता है भले ही उपयोगकर्ता इनपुट "1 9 .1.169.1" है। नेट पते के अंतिम सेट के बिना। – alexandrudicu

0

आप IPAddress.GetAddressBytes()। लंबाई संपत्ति का उपयोग कर सकते

 IPAddress someIP; 

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

मैं

2

काम करना चाहिए आप हर पूर्णांक पार्स करने के लिए नहीं करना चाहते हैं लगता है, लेकिन केवल आईपी, बस आईपीवी 4 के लिए . आईपीवी 4 और : के लिए जांचें।

 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

एक स्ट्रिंग या IPAddress के लिए आवेदन किया परीक्षण का एक संयोजन, मेरे लिए काम करता ..

 /// <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; 
    } 
संबंधित मुद्दे