2009-11-05 8 views

Trả lời

5

Đây là một cách tiếp cận thay thế cũng có thể hữu ích. Giả sử bạn có một NSString* có chứa địa chỉ IP của bạn, gọi ipAddressStr, của định dạng 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]); 
} 

Bạn có thể sửa đổi các khối có điều kiện if theo RFC 1918 hướng dẫn, nếu bạn cần có mức độ xác nhận.

+0

Alex, ý của bạn là đặt '&' trước mỗi đối số ipQuad vào sscanf? –

+0

Ý tôi là, nhưng tôi thì không. Tôi sẽ chỉnh sửa câu trả lời sau khi tôi thêm nhận xét này. Ngoài ra, tôi đã thay đổi kiểu 'ipQuads' từ' unsigned char' thành 'unsigned int', để kiểm tra có cơ hội thất bại. –

+0

Vì iOS 4 RegExps khả dụng trong iOS SDK: http://developer.apple.com/library/IOs/#documentation/Foundation/Reference/NSRegularExpression_Class/Reference/Reference.html ... vì vậy, có thể nếu bạn muốn đánh dấu câu trả lời này không được dùng nữa "nhưng hữu ích cho mục đích thông tin hoặc giáo dục" sẽ giúp :) –

1

Một thủ thuật bạn có thể làm là kiểm tra sự trở lại của cuộc gọi BSD inet_aton như thế này:

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

Hãy tuy nhiên ý thức được rằng đây xác nhận chuỗi nếu nó có chứa một địa chỉ IP ở định dạng bất kỳ, nó không bị hạn chế với định dạng chấm chấm.

+0

FYI: 'inet_aton' đã không được hỗ trợ cho' inet_pton', xử lý IPv6. – mattt

+1

Xin vui lòng nếu yo đang trả về một boolean từ một nếu kiểm tra chỉ trả lại nếu kiểm tra chính nó tức là 'trở về thành công == 1' –

21

Đây là danh mục sử dụng inet_pton hiện đại sẽ trả về CÓ cho chuỗi IPv4 hoặc IPv6 hợp lệ.

#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

Để tham khảo trong tương lai, sự thành công == 1? TRUE: FALSE không cần thiết. Một thành công đơn giản == 1 sẽ hoạt động. – varikin

0

Swift phiên bản:

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 
}