2014-01-12 31 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