127.0.0.1 - это адрес устройства обратной связи. Вам нужен адрес en0
или любой другой, который является устройством, подключенным к Wi-Fi / мобильной сети. (Можно перечислить все адреса устройств с помощью getifaddrs()
; см. ТАК вопрос).
Для IPv4-адреса значение может быть представлено с помощью 32-битного unsigned int
, поэтому изменение диапазона так же просто, как:
BOOL inRange = ipAddress >= rangeStart && ipAddress <= endRange;
См. Этот вопрос SO.
EDIT OP, похоже, застрял на преобразовании IP-адреса, представленного с использованием точечной нотации в строке (например, «2.88.0.0») и unsigned int
, о котором я говорю. Для этого я отсылаю его к _ 6_, которая используется для выполнения этого преобразования. Вы получите множество посещений в Интернете, если будете искать эту функцию и способы ее использования.
ИЗМЕНИТЬ 2. Хорошо, я добавлю более полный ответ, поскольку у OP все еще есть проблемы:
Я думаю, что вам не хватает WRT при использовании inet_aton()
ключевой информации, это порядок байтов. Существует концепция сетевого порядка байтов, которая является прямым порядком байтов, учитывая, что основатели Интернета использовали для разработки Dec PDP 11. Большинство компьютеров в наши дни работают с прямым порядком байтов. Таким образом, вам нужно добавить htonl()
в смесь, которая является функцией для преобразования из сети в порядок байтов хоста (где l
означает длинный, что на самом деле является 32-битным).
So:
#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
person
trojanfoe
schedule
09.02.2014