2014-01-12 35 views
3

如何去目标C计算广播地址计算广播地址在Objective-C

我想有广播地址解析为相同的结果显示在下面的子网计算器 - http://www.subnet-calculator.com/subnet.php

我有我的本地IOS设备和子网掩码的IP地址。我知道,广播地址的计算公式如下

broadcast = ip | (~ subnet) 

(我回答我自己,因为我还没有看到这个在互联网上的任何地方,而且我不知道哪个执行此计算的任何库。很高兴看到其他人是否有更好的解决方案或知道任何库)

回答

5

替代解决方案:

#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)]; 
+0

谢谢,少了很多的代码,并可能快了很多,也 – Remixed123

0

以下代码可用于计算广播地址,您只需要IP地址和NSString类型中的子网掩码即可执行计算。

//////////////////////////////////////////////////////// 
// Calculates the local broadcast packet from Local IP Address and Subnet Mask. 
// Uses the following calculation:- 
// broadcast = ip | (~ subnet) i.e. Broadcast = ip-addr OR the inverted subnet-mask 
//////////////////////////////////////////////////////// 

// Local IP Address and Subnet Mask 
NSString *localIPAddress = @"192.168.1.10"; 
NSString *netmaskAddress = @"255.255.192.0"; 

// Separate out the subnet mask values and assign them to variables as integers 
NSScanner* scannerNetmask = [NSScanner scannerWithString:netmaskAddress]; 
[scannerNetmask setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"."]]; 
int aNetmask, bNetmask, cNetmask, dNetmask; 
[scannerNetmask scanInt:&aNetmask]; 
[scannerNetmask scanInt:&bNetmask]; 
[scannerNetmask scanInt:&cNetmask]; 
[scannerNetmask scanInt:&dNetmask]; 

// Separate out the ip address values and assign them to variables as integers 
NSScanner* scannerLocalIP = [NSScanner scannerWithString:localIPAddress]; 
[scannerLocalIP setCharactersToBeSkipped:[NSCharacterSet characterSetWithCharactersInString:@"."]]; 
int aLocalIP, bLocalIP, cLocalIP, dLocalIP; 
[scannerLocalIP scanInt:&aLocalIP]; 
[scannerLocalIP scanInt:&bLocalIP]; 
[scannerLocalIP scanInt:&cLocalIP]; 
[scannerLocalIP scanInt:&dLocalIP]; 

// Calculate the bitwise inversion of the Netmask 
// Do this by first casting value as a unsigned char (1 byte, no complement) 
unsigned char biNetmask, ciNetmask, diNetmask; 
biNetmask = ~(unsigned char)bNetmask; 
ciNetmask = ~(unsigned char)cNetmask; 
diNetmask = ~(unsigned char)dNetmask; 

// Calculating the separated values for the broadcast address 
unsigned char bBroadcast, cBroadcast, dBroadcast; 
bBroadcast = (unsigned char)bLocalIP | biNetmask; 
cBroadcast = (unsigned char)cLocalIP | ciNetmask; 
dBroadcast = (unsigned char)dLocalIP | diNetmask; 

// Create the Broadcast Address from separate values and display in the console 
NSString broadcastAddress = [NSString stringWithFormat:@"%d.%d.%d.%d", aLocalIP, bBroadcast, cBroadcast, dBroadcast]; 
NSLog(@"Broadcast Address: %@", broadcastAddress); 
3

你并不需要提供IP地址&子网掩码计算任何网络界面的“广播”地址。其实你不需要手动计算它。

存在描述网络主机的ifaddrs Structure。它提供了任何网络接口的完整细节。通过使用getifaddrs()方法,您可以检索网络的广播地址,而无需提供IP &子网掩码作为属性。函数本身检索细节。我更喜欢这个,因为这会使代码更通用。

我在我的代码中使用了这个。

#import <ifaddrs.h> // for interface addresses needed to find local IP 

static NSString * broadcastAddress() 
//Gets Local IP of the device over Wifi 
//Calculates & returns broadcast Address for the network 
{ 
    NSString * broadcastAddr= @"Error"; 
    struct ifaddrs *interfaces = NULL; 
    struct ifaddrs *temp_addr = NULL; 
    int success = 0; 

    // retrieve the current interfaces - returns 0 on success 
    success = getifaddrs(&interfaces); 

    if (success == 0) 
    { 
     temp_addr = interfaces; 

     while(temp_addr != NULL) 
     { 
      // check if interface is en0 which is the wifi connection on the iPhone 
      if(temp_addr->ifa_addr->sa_family == AF_INET) 
      { 
       if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) 
       { 
        broadcastAddr = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_dstaddr)->sin_addr)]; 

       } 
      } 

      temp_addr = temp_addr->ifa_next; 
     } 
    } 

    freeifaddrs(interfaces); 
    return broadcastAddr; 
} 

为了更多地了解ifaddrs structureSee this