2014-02-13 2 views
0

작은 iPhone 응용 프로그램을 만들고 IP 범위를 가져와 객관적인 C를 통해 반복해야합니다. 로컬 IP, 넷 마스크를 얻을 수 있습니다. 또한 SO 솔루션에서 브로드 캐스트 주소를 얻는 방법을 찾았습니다. 하지만 어떻게 네트워크 주소를 얻을 수 있습니까? 네트워크 주소를 알면 무엇이 로컬 네트워크의 첫 번째이고 브로드 캐스트 주소는 로컬 네트워크의 마지막 주소인지 알면 해당 범위의 모든 IP를 반복하고 싶습니다. 간단히 전화를 걸어 응답을보십시오. 어떻게해야합니까?목표 C를 사용하여 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를 어떻게 얻을 수 있습니까? 예를 들어

NSString *ip = "192.168.1.5" 

목표 C에서 "192.168.1.6"을 어떻게 얻을 수 있습니까?

+0

당신은 무엇을 반복 할 수 있습니까? 유스 케이스에 대해 설명해 주시겠습니까? – Moonwalkr

+0

네트워크에서 다른 장치를 찾아야합니다. 그래서 로컬 네트워크에서 모든 IP를 호출해야합니다. – poul

+0

iOS 멀티 피어 연결을 살펴 보셨습니까? 아마 당신의 유스 케이스를 해결할 것입니다 : http://nshipster.com/multipeer-connectivity/ https://developer.apple.com/library/ios/documentation/MultipeerConnectivity/Reference/MultipeerConnectivityFramework/Introduction/Introduction.html – rist

답변

1

이 종류의 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 
관련 문제