Objective c 循环ip范围与目标c

Objective c 循环ip范围与目标c,objective-c,ip,Objective C,Ip,我有IP范围 NSString *startIp = @"192.168.3.15" NSString *endIp = @"192.168.4.3" 和网络掩码 NSString *netMask = @"255.255.240.0" 如何将该范围与目标c循环?例如,循环和打印IP 使用in_addr,我可以将ip转换为int struct in_addr startAddr; inet_aton([startIp UTF8String], &startAddr); int ip

我有IP范围

NSString *startIp = @"192.168.3.15"
NSString *endIp = @"192.168.4.3"
和网络掩码

NSString *netMask = @"255.255.240.0"
如何将该范围与目标c循环?例如,循环和打印IP

使用in_addr,我可以将ip转换为int

struct in_addr startAddr;
inet_aton([startIp UTF8String], &startAddr);

int ipInt = startAddr.s_addr;
通过使用16777216递增ipInt,我将获得下一个IP的整数。但是做

int nextIpInt = ipInt + 16777216

它很难看。如何替换它?

我建议使用ComponentSeparatedByString:来获得每个ip的每个部分,如下所示:

NSArray *startIpItems = [startIp componentsSeparatedByString:@"."];
NSArray *EndIpItems = [EndIp componentsSeparatedByString:@"."];
然后你可以用

[[startIpItems objectAtIndex:0] intValue]

依此类推,对于每个项目和嵌套循环,每次从您的值转到255。

下面的代码正在打印设备ip、网络ip、网络掩码和广播地址以及网络范围内的所有ip。这可能会有帮助

NetworkInformation *network = [[NetworkInformation alloc] init];
NSLog(@"%@", network);
for(NSString *ip in network.ipsInRange){
    NSLog(@"ip: %@", ip);
}
网络信息

#import <Foundation/Foundation.h>

@interface NetworkInformation : NSObject
@property (nonatomic, retain) NSString *deviceIP;
@property (nonatomic, retain) NSString *netmask;
@property (nonatomic, retain) NSString *address;
@property (nonatomic, retain) NSString *broadcast;
@property (nonatomic, retain) NSArray *ipsInRange;
- (void)updateData;
- (NSString *)description;
@end
#导入
@接口网络信息:NSObject
@属性(非原子,保留)NSString*deviceIP;
@属性(非原子,保留)NSString*网络掩码;
@属性(非原子,保留)NSString*地址;
@属性(非原子,保留)NSString*广播;
@属性(非原子,保留)NSArray*ipsInRange;
-(无效)更新数据;
-(NSString*)说明;
@结束
NetworkInformation.m

#import "NetworkInformation.h"
#import <arpa/inet.h>
#import <ifaddrs.h>

@implementation NetworkInformation

- (id)init {
    self = [super init];
    if (self) {
        [self updateData];
    }
    return self;
}

-(void)updateData {
    [self updateDataFromWifiNetwork];
    self.address = [self getNetworkAddress];
    self.ipsInRange = [self getIPsInRange];
}

- (void)updateDataFromWifiNetwork {
    self.deviceIP = nil;
    self.netmask = nil;
    self.broadcast = nil;
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    success = getifaddrs(&interfaces);
    if (success == 0){
        temp_addr = interfaces;
        while(temp_addr != NULL){
            if(temp_addr->ifa_addr->sa_family == AF_INET){
                if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]){
                    self.deviceIP = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                    self.netmask = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)];
                    self.broadcast = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)];
                }
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    freeifaddrs(interfaces);
    if(!self.deviceIP || !self.netmask){
        NSLog(@"error in updateDataFromWifiNetwork, device ip: %@ netmask: %@", self.deviceIP, self.netmask);
    }
}

-(NSString*)getNetworkAddress {
    if(!self.deviceIP || !self.netmask){
        return nil;
    }
    unsigned int address = [self convertSymbolicIpToNumeric:self.deviceIP];
    address &= [self convertSymbolicIpToNumeric:self.netmask];
    return [self convertNumericIpToSymbolic:address];
}

-(NSArray*)getIPsInRange {
    unsigned int address = [self convertSymbolicIpToNumeric:self.address];
    unsigned int netmask = [self convertSymbolicIpToNumeric:self.netmask];
    NSMutableArray *result = [[NSMutableArray alloc] init];
    int numberOfBits;
    for (numberOfBits = 0; numberOfBits < 32; numberOfBits++) {
        if ((netmask << numberOfBits) == 0){
            break;
        }
    }
    int numberOfIPs = 0;
    for (int n = 0; n < (32 - numberOfBits); n++) {
        numberOfIPs = numberOfIPs << 1;
        numberOfIPs = numberOfIPs | 0x01;
    }
    for (int i = 1; i < (numberOfIPs) && i < numberOfIPs; i++) {
        unsigned int ourIP = address + i;
        NSString *ip = [self convertNumericIpToSymbolic:ourIP];
        [result addObject:ip];
    }
    return result;
}

-(NSString*)convertNumericIpToSymbolic:(unsigned int)numericIP {
    NSMutableString *sb = [NSMutableString string];
    for (int shift = 24; shift > 0; shift -= 8) {
        [sb appendString:[NSString stringWithFormat:@"%d", (numericIP >> shift) & 0xff]];
        [sb appendString:@"."];
    }
    [sb appendString:[NSString stringWithFormat:@"%d", (numericIP & 0xff)]];
    return sb;
}

-(unsigned int)convertSymbolicIpToNumeric:(NSString*)symbolicIP {
    NSArray *st = [symbolicIP componentsSeparatedByString: @"."];
    if (st.count != 4){
        NSLog(@"error in convertSymbolicIpToNumeric, splited string count: %lu", st.count);
        return 0;
    }
    int i = 24;
    int ipNumeric = 0;
    for (int n = 0; n < st.count; n++) {
        int value = [(NSString*)st[n] intValue];
        if (value != (value & 0xff)) {
            NSLog(@"error in convertSymbolicIpToNumeric, invalid IP address: %@", symbolicIP);
            return 0;
        }
        ipNumeric += value << i;
        i -= 8;
    }
    return ipNumeric;
}

-(NSString*)description {
    return [NSString stringWithFormat: @"\nip:%@\nnetmask:%@\nnetwork:%@\nbroadcast:%@", self.deviceIP, self.netmask, self.address, self.broadcast];
}

@end
#导入“NetworkInformation.h”
#进口
#进口
@实施网络信息
-(id)init{
self=[super init];
如果(自我){
[自更新数据];
}
回归自我;
}
-(无效)更新数据{
[自更新数据来自WifineTwork];
self.address=[self-getNetworkAddress];
self.ipsInRange=[self-getIPsInRange];
}
-(void)从WifineTwork更新的数据{
self.deviceIP=nil;
self.netmask=nil;
self.broadcast=nil;
struct ifaddrs*interfaces=NULL;
结构ifaddrs*临时地址=NULL;
int成功=0;
success=getifaddrs(&interfaces);
如果(成功==0){
临时地址=接口;
while(临时地址!=NULL){
如果(临时地址->ifa地址->sa家庭==AF家庭){
如果([[NSString stringWithUTF8String:temp_addr->ifa_name]是等效字符串:@“en0”]){
self.deviceIP=[NSString stringWithUTF8String:inet\u ntoa(((struct sockaddr\u in*)temp\u addr->ifa\u addr)->sin\u addr)];
self.netmask=[NSString stringWithUTF8String:inet\u ntoa(((struct sockaddr\u in*)temp\u addr->ifa\u netmask)->sin\u addr)];
self.broadcast=[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in*)temp_addr->ifa_dstaddr)->sin_addr)];
}
}
临时地址=临时地址->ifa\U下一步;
}
}
freeifaddrs(接口);
如果(!self.deviceIP | |!self.netmask){
NSLog(@“updateDataFromWifiNetwork中出错,设备ip:%@netmask:%@”,self.deviceIP,self.netmask);
}
}
-(NSString*)getNetworkAddress{
如果(!self.deviceIP | |!self.netmask){
返回零;
}
无符号整数地址=[self-convertSymbolicCiptomeric:self.deviceIP];
地址&=[自转换符号密码:self.netmask];
返回[自转换数字符号:地址];
}
-(NSArray*)getIPsInRange{
无符号整数地址=[self-convertSymbolicCiptonumeric:self.address];
无符号int-netmask=[self-convertSymbolicCiptonumeric:self.netmask];
NSMUTABLEARRY*结果=[[NSMUTABLEARRY alloc]init];
整数位数;
for(numberOfBits=0;numberOfBits<32;numberOfBits++){
如果((网络掩码>移位)&0xff]];
[sb-appendString:@.”;
}
[sb appendString:[NSString stringWithFormat:@“%d”,(numericp&0xff)];
归还某人;
}
-(无符号整数)ConvertSymbolicCiptumeric:(NSString*)SymbolicCip{
NSArray*st=[SYMBOLCIP组件由字符串分隔:@.”;
如果(标准计数!=4){
NSLog(@“密码学中的错误,拆分字符串计数:%lu”,st.count);
返回0;
}
int i=24;
int-ipNumeric=0;
对于(int n=0;nipNumeric+=值您想用它做什么?您要将它插入什么类型的代码?一个简单的扫描仪。将尝试与范围内的每个IP通信并找到所需的设备。将是一个类似“”的get请求这是一种方法,但对于很多嵌套循环来说效率不高。应该有一些简单的解决方案。最多4个循环,每个ip号一个,考虑到您的请求所需的时间,循环时间可以忽略不计。我可以集中精力完成其他任务,直到我在这里得到良好的响应或自己找到解决方法。但是answ呃,关于我的问题,可能对未来的其他人有用IPS是以特殊方式格式化的int64类型。你可以研究一下。但我认为你正在努力为一个相当简单的问题找到一个困难的解决方案,你可以使用循环在5分钟内解决。