2014-02-09 263 views
0

我正在開發一個應用程序,顯示基於國家的內容,所以我得到的IP地址的用戶,問題是如何檢查此IP是否在兩個IP之間。例如:iOS iP地址比較IP範圍

,如果我有這個IP:MYIP = 127.0.0.1

我怎麼能檢查它是否在這個範圍之間: IP1 = 2.88.0.0; IP2 = 2.91.255.255;

謝謝。

回答

2

127.0.0.1是回送設備的地址。你想要的地址是en0或其他什麼,這是連接到無線/移動網絡的設備。 (可以使用getifaddrs()枚舉所有設備地址;請參閱此SO question)。

對於IPv4地址中的值可以使用的32位unsigned int來表示這樣的範圍內的變化是簡單:

BOOL inRange = ipAddress >= rangeStart && ipAddress <= endRange; 

見本SO question

EDIT的OP似乎被卡住上的IP地址的轉換使用一個字符串內點表示法(即「2.88.0.0」)和我指的是unsigned int表示。爲此,我將其稱爲inet_aton()函數,該函數用於執行該轉換。如果您搜索該功能以及如何使用它,您將在互聯網上獲得許多點擊量。

EDIT 2 OK,我將添加一個更完整的答案爲OP仍然有問題:

的關鍵信息,我認爲你正在使用inet_aton()缺少WRT是字節順序。有一個網絡字節順序的概念,鑑於互聯網的創始人使用Dec PDP 11進行開發,這是一個大端的概念。現在大多數電腦都是小端的。因此,您需要將htonl()添加到組合中,這是將網絡轉換爲主機字節順序的功能(其中l表示長,實際上是32位)。

所以:

#import <Foundation/Foundation.h> 
#import <sys/socket.h> 
#import <netinet/in.h> 
#import <arpa/inet.h> 

@interface NetworkStuff : NSObject 
- (uint32_t)convertIpAddress:(NSString *)ipAddress; 
- (BOOL)ipAddress:(NSString *)ipAddress isBetweenIpAddress:(NSString *)rangeStart 
    andIpAddress:(NSString *)rangeEnd; 
@end 

@implementation NetworkStuff 
- (uint32_t)convertIpAddress:(NSString *)ipAddress { 
    struct sockaddr_in sin; 
    inet_aton([ipAddress UTF8String], &sin.sin_addr); 
    return ntohl(sin.sin_addr.s_addr); 
} 

- (BOOL)ipAddress:(NSString *)ipAddress isBetweenIpAddress:(NSString *)rangeStart 
    andIpAddress:(NSString *)rangeEnd { 
    uint32_t ip = [self convertIpAddress:ipAddress]; 
    uint32_t start = [self convertIpAddress:rangeStart]; 
    uint32_t end = [self convertIpAddress:rangeEnd]; 
    return ip >= start && ip <= end; 
} 

@end 

#define BOOLSTR(b) (b ? @"YES" : @"NO") 

int main() 
{ 
    @autoreleasepool{ 
     NetworkStuff *networkStuff = [NetworkStuff new]; 
     NSLog(@"%@", BOOLSTR([networkStuff ipAddress:@"2.90.1.2" isBetweenIpAddress:@"2.88.0.0" andIpAddress:@"2.91.255.255"])); 
     NSLog(@"%@", BOOLSTR([networkStuff ipAddress:@"2.92.1.2" isBetweenIpAddress:@"2.88.0.0" andIpAddress:@"2.91.255.255"])); 
    } 
    return 0; 
} 

$ clang -DDEBUG=1 -g -fobjc-arc -o iprange iprange.m -framework Foundation 
$ ./iprange 
2014-02-10 09:42:29.530 iprange[14693:707] YES 
2014-02-10 09:42:29.532 iprange[14693:707] NO 
+0

thanx的烏拉圭回合的答案,但如果我這樣做 NSRange range = NSMakeRange(2.88.0.0,2.91.255.255); 它給了我一個警告,說明2.88.0.0不是int或double ..etc – Atrash

+0

還可能有其他的事情需要考慮:如果你在具有NAT的路由器後面,Wifi地址可以是「本地」地址。移動地址可能是IPv6地址... –

+0

@MKAlatrash:我在trojanfoe的答案和NSMakeRange()之間看不到任何連接。 –

0

首先我必須使用下面的方法轉換成IP地址數:

-(double)getIpAsNumberr:(NSString *)ip 
{ 
    NSArray *ipParts = [ip componentsSeparatedByString:@"."]; 
    double result = 0; 

    for (int i = 0; i < 4; i++) 
    { 
     result += [ipParts[i]doubleValue] * (pow(256, (3 - i))); 
    } 

    return result; 
} 

轉換我用下面的方法將IP地址後發現,如果IP地址是在2.88.0.0和2.91.255.255之間的某些範圍內下降:

-(BOOL)isBetween:(NSString *)myIPAddress fromRange:(NSString *)from ToRange:(NSString *)to 
{ 
    double myIpAsNumber = [self getIpAsNumberr:myIPAddress]; 
    double ipFromAsNumber = [self getIpAsNumberr:from]; 
    double ipToAsNumber = [self getIpAsNumberr:to]; 

    BOOL inRange = myIpAsNumber >= ipFromAsNumber && myIpAsNumber <= ipToAsNumber; 

    return inRange; 
} 

Th在它的。

下面的方法我用的IP地址轉換爲無符號整數,(沒有爲我工作,所以我就用上面的一個):

-(double)getIpAsUnSignedInteger:(NSString *)ip 
{ 
    struct sockaddr_in antelope; 
    char *some_addr; 
    const char *ipUnsigned = [ip cStringUsingEncoding:NSStringEncodingConversionAllowLossy]; 

    inet_aton(ipUnsigned, &antelope.sin_addr); // store IP in antelope 

    some_addr = inet_ntoa(antelope.sin_addr); // return the IP 
    printf("%s\n", some_addr); // prints the IP Address 

    // and this call is the same as the inet_aton() call, above: 
    antelope.sin_addr.s_addr = inet_addr(ipUnsigned); 

    NSString *ipAsNumber = [NSString stringWithFormat:@"%u",antelope.sin_addr.s_addr]; 
    NSLog(@"ssss == %@",ipAsNumber); 

    return [ipAsNumber doubleValue]; 
} 
+0

爲什麼「雙」? IPv4地址可以使用無符號的32位整數表示。 – trojanfoe

+0

我試圖使它32位整數,它改變了..但是當我試圖比較它沒有工作..我會發布我用它將其轉換爲32位整數的方法。 – Atrash

+0

@trojanfoe看到編輯,我添加了將IP地址轉換爲UnSigned Integer的方法。 – Atrash