繁体   English   中英

使用目标C获取IP范围

[英]Get ip range with objective C

我做一个小型iPhone应用程序,我需要获取IP范围并以目标C遍历它。我可以获取本地IP,网络掩码。 我也在SO解决方案上找到了如何获取广播地址。 但是我又如何获得网络地址? 通过知道网络地址是本地网络中的第一位,并且知道广播地址是本地网络中的最后一位,我想迭代该范围内的所有IP。 只需调用它即可查看响应。 我怎样才能做到这一点?

https://stackoverflow.com/a/21077257获得广播的解决方案

#include <net/ethernet.h>
#include <arpa/inet.h>

NSString *localIPAddress = @"192.168.1.10";
NSString *netmaskAddress = @"255.255.192.0";

// Strings to in_addr:
struct in_addr localAddr;
struct in_addr netmaskAddr;
inet_aton([localIPAddress UTF8String], &localAddr);
inet_aton([netmaskAddress UTF8String], &netmaskAddr);

// The broadcast address calculation:
localAddr.s_addr |= ~(netmaskAddr.s_addr);

// in_addr to string:
NSString *broadCastAddress = [NSString stringWithUTF8String:inet_ntoa(localAddr)];

更新:从netmaskAddress我可以获取网络中的主机数。 我只需要使用IP。 现在的问题是如何从给定的IP获得下一个IP? 例如我有

NSString *ip = "192.168.1.5"

如何获得目标C的“ 192.168.1.6”?

我不建议对这种IP(in_addr)进行位操作,因为如果您看一看内部的字节是相反顺序的。

下面的代码打印设备IP,网络IP,网络掩码和广播地址以及网络范围内的所有IP。 这可能会有所帮助。 请享用!

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

NetworkInformation.h

#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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM