计算Objective-C中的广播地址

如何计算目标C中的广播地址?

我希望广播地址parsing为与以下子网计算器中显示的结果相同 – http://www.subnet-calculator.com/subnet.php

我有我的本地IOS设备和子网掩码的IP地址。 而且我知道广播地址使用下面的公式

broadcast = ip | ( ~ subnet ) 

(我正在回答自己的问题,因为我没有在互联网上看到过这些信息,而且我也没有意识到任何执行这个计算的程序库。很高兴看到其他人是否有更好的解决scheme或者知道任何库)

替代scheme:

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

您不需要提供IP地址和子网掩码来计算任何networking接口的“广播”地址。 其实你不需要手动计算它。

ifaddrs Structure描述networking主机的ifaddrs Structure 。 它提供了任何networking接口的完整细节。 通过使用getifaddrs()方法,您可以检索networking的广播地址,而无需提供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 structure 看到这个

以下代码可用于计算广播地址,您只需要使用NSStringtypes的IP地址和子网掩码来执行计算。

 //////////////////////////////////////////////////////// // Calculates the local broadcast packet from Local IP Address and Subnet Mask. // Uses the following calculation:- // broadcast = ip | ( ~ subnet ) ie 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);