2014-02-09 300 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