2009-11-05 8 views
5

उद्देश्य-सी में किसी आईपी पते को कैसे सत्यापित करें?उद्देश्य-सी में नियमित अभिव्यक्ति के साथ एक आईपी पता कैसे सत्यापित करें?

+0

मैं इसे समझ में नहीं आता। नियमित अभिव्यक्ति क्यों होनी चाहिए? – soulmerge

+1

आप एनएसएसकेनर के साथ बेहतर हो सकते हैं, बशर्ते कोई अंतर्निहित रेगेक्स लाइब्रेरी न हो। –

+0

मैं एनएसएससीनर के साथ ऐसा कैसे कर सकता हूं? – diana

उत्तर

5

यहां एक वैकल्पिक दृष्टिकोण है जो मदद भी कर सकता है। मान लेते हैं कि आप एक NSString* कि आपके आईपी पते शामिल हैं, ipAddressStr कहा जाता है, प्रारूप a.b.c.d की करते हैं:

int ipQuads[4]; 
const char *ipAddress = [ipAddressStr cStringUsingEncoding:NSUTF8StringEncoding]; 

sscanf(ipAddress, "%d.%d.%d.%d", &ipQuads[0], &ipQuads[1], &ipQuads[2], &ipQuads[3]); 

@try { 
    for (int quad = 0; quad < 4; quad++) { 
     if ((ipQuads[quad] < 0) || (ipQuads[quad] > 255)) { 
     NSException *ipException = [NSException 
      exceptionWithName:@"IPNotFormattedCorrectly" 
      reason:@"IP range is invalid" 
      userInfo:nil]; 
     @throw ipException; 
     } 
    } 
} 
@catch (NSException *exc) { 
    NSLog(@"ERROR: %@", [exc reason]); 
} 

आप if सशर्त ब्लॉक संशोधित RFC 1918 दिशा निर्देशों का पालन करने के लिए, यदि आप सत्यापन के उस स्तर की जरूरत सकता है।

+0

एलेक्स, क्या आप प्रत्येक ipQuad तर्क से पहले '&' को एसएसकेएनएफ में डालने का मतलब रखते थे? –

+0

मेरा मतलब था, लेकिन मैंने नहीं किया। इस टिप्पणी को जोड़ने के बाद मैं जवाब संपादित कर दूंगा। साथ ही, मैंने 'आईपक्वाड्स' के प्रकार को 'हस्ताक्षरित चार' से 'हस्ताक्षरित int' में बदल दिया, ताकि परीक्षण में असफल होने का मौका हो। –

+0

आईओएस 4 RegExps आईओएस एसडीके में उपलब्ध हैं: http://developer.apple.com/library/IOs/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html ... तो, शायद अगर आप चिह्नित करना चाहते हैं इस उत्तर को "सूचनात्मक या शैक्षिक उद्देश्यों के लिए उपयोगी" के रूप में मदद मिलेगी :) –

1

एक चाल आप कर सकते हैं इस तरह inet_aton बीएसडी कॉल के रिटर्न का परीक्षण है:

#include <arpa/inet.h> 

- (BOOL)isIp:(NSString*)string{ 
    struct in_addr pin; 
    int success = inet_aton([string UTF8String],&pin); 
    if (success == 1) return TRUE; 
    return FALSE; 
} 

बारे में पता है लेकिन है कि इस स्ट्रिंग की पुष्टि करता है अगर यह किसी भी प्रारूप में एक IP पता है, जैसे आप ही सीमित नहीं है बिंदीदार प्रारूप में।

+0

एफवाईआई: 'inet_aton' को 'inet_pton' के पक्ष में बहिष्कृत कर दिया गया है, जो आईपीवी 6 को संभालता है। – mattt

+1

कृपया अगर आप एक बूलियन लौट रहे हैं तो चेक करें अगर चेक स्वयं ही जांचें तो i.e. वापसी की सफलता == 1' –

21

यहां आधुनिक इनेट_प्टन का उपयोग करके एक श्रेणी है जो एक वैध आईपीवी 4 या आईपीवी 6 स्ट्रिंग के लिए हाँ वापस कर देगी।

#include <arpa/inet.h> 

    @implementation NSString (IPValidation) 

    - (BOOL)isValidIPAddress 
    { 
     const char *utf8 = [self UTF8String]; 
     int success; 

     struct in_addr dst; 
     success = inet_pton(AF_INET, utf8, &dst); 
     if (success != 1) { 
      struct in6_addr dst6; 
      success = inet_pton(AF_INET6, utf8, &dst6); 
     } 

     return success == 1; 
    } 

    @end 
+3

भविष्य के संदर्भ के लिए, सफलता == 1? सही: गलत की आवश्यकता नहीं है। एक साधारण सफलता == 1 काम करेगा। – varikin

0

स्विफ्ट संस्करण:

func isIPAddressValid(ip: String) -> Bool { 
    guard let utf8Str = (ip as NSString).utf8String else { 
     return false 
    } 

    let utf8:UnsafePointer<Int8> = UnsafePointer(utf8Str) 
    var success: Int32 

    var dst: in_addr = in_addr() 
    success = inet_pton(AF_INET, utf8, &dst) 
    if (success != 1) { 
     var dst6: in6_addr? = in6_addr() 
     success = inet_pton(AF_INET6, utf8, &dst6); 
    } 

    return success == 1 
} 
संबंधित मुद्दे