我正在開發一個應用程序,顯示基於國家的內容,所以我得到的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()之間看不到任何連接。 –