我正在开发一个应用程序,显示基于国家的内容,所以我得到的IP地址的用户,问题是如何检查此IP是否在两个IP之间。例如:iOS iP地址比较IP范围
,如果我有这个IP:MYIP = 127.0.0.1
我怎么能检查它是否在这个范围之间: IP1 = 2.88.0.0; IP2 = 2.91.255.255;
谢谢。
我正在开发一个应用程序,显示基于国家的内容,所以我得到的IP地址的用户,问题是如何检查此IP是否在两个IP之间。例如:iOS iP地址比较IP范围
,如果我有这个IP:MYIP = 127.0.0.1
我怎么能检查它是否在这个范围之间: IP1 = 2.88.0.0; IP2 = 2.91.255.255;
谢谢。
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
首先我必须使用下面的方法转换成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];
}
thanx的乌拉圭回合的答案,但如果我这样做 NSRange range = NSMakeRange(2.88.0.0,2.91.255.255); 它给了我一个警告,说明2.88.0.0不是int或double ..etc – Atrash
还可能有其他的事情需要考虑:如果你在具有NAT的路由器后面,Wifi地址可以是“本地”地址。移动地址可能是IPv6地址... –
@MKAlatrash:我在trojanfoe的答案和NSMakeRange()之间看不到任何连接。 –