2009-11-05 20 views

cevap

5

İşte size yardımcı olabilecek alternatif bir yaklaşım. Diyelim ki biçim a.b.c.d arasında ipAddressStr denilen IP adresi içeren bir NSString*, olduğunu varsayalım:

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]); 
} 

Sen doğrulama bu düzeyde gerekiyorsa, RFC 1918 kurallara uymayı if koşullu blok değiştirebilir. o sınırlı değildir,

#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; 
} 

herhangi biçimde bir ip adresi içeriyorsa bu dizeyi doğrulama Ancak unutmayın:

+0

Alex, sscanf için her ipQuad argümanından önce bir '&' koymak istediniz mi? –

+0

Yapmak istedim ama yapmadım. Bu yorumu ekledikten sonra cevabı düzenleyeceğim. Ayrıca, "ipQuads" türünü "imzasız char" dan "unsigned int" olarak değiştirdim, böylece testin başarısız olma şansı var. –

+0

iOS 4'den itibaren RegExps iOS SDK'da kullanılabilir: http://developer.apple.com/library/IOs/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html ... yani, eğer işaretlemek isterseniz Bu yanıt, "ama bilgilendirici ya da eğitim amaçlı yararlı" olarak kabul edilecektir :) –

1

Yapabileceğiniz bir hile böyle inet_aton BSD çağrının dönüşünü sınamak olduğunu noktalı formatta.

+0

FYI: 'inet_aton', IPv6'yı işleyen inet_pton'un lehine kullanımdan kaldırıldı. – mattt

+1

Eğer bir boole döndürüyorsanız lütfen kontrol edin, eğer geri dönüp dönmeyin, sadece kendi başına kontrol edin = ''return success == 1' –

21

Geçerli bir IPv4 veya IPv6 dizesi için YES döndürecek olan modern inet_pton'u kullanarak bir kategori.

#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

Gelecekte referans için, başarı == 1? TRUE: FALSE gerekli değil. Basit bir başarı == 1 çalışırdı. – varikin

0

Swift baskı:

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 
} 
İlgili konular