Ios 在Objective-C中计算广播地址

Ios 在Objective-C中计算广播地址,ios,objective-c,networking,broadcast,subnet,Ios,Objective C,Networking,Broadcast,Subnet,如何计算目标C中的广播地址 我希望广播地址解析为以下子网计算器中显示的相同结果- 我有本地IOS设备的IP地址和子网掩码。我知道广播地址使用以下公式 broadcast = ip | ( ~ subnet ) (我在回答我自己,因为我在任何地方都没有在互联网上看到这一点,而且我也不知道有任何库执行此计算。很高兴看到是否有其他人有更好的解决方案或知道任何库)以下代码可用于计算广播地址,执行计算所需的只是NSString类型中的IP地址和子网掩码 /////////////////////////

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

我希望广播地址解析为以下子网计算器中显示的相同结果-

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

broadcast = ip | ( ~ subnet )

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

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

////////////////////////////////////////////////////////
// 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);
替代解决方案:

#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)];
#包括
#包括
NSString*localIPAddress=@“192.168.1.10”;
NSString*netmaskAddress=@“255.255.192.0”;
//要添加的字符串:
_addr localAddr中的结构;
地址为netmaskAddr的结构;
inet_aton([localIPAddress UTF8String],&localAddr);
inet_aton([netmaskAddress UTF8String],&netmaskAddr);
//广播地址计算:
localAddr.s|u addr |=~(netmaskAddr.s|addr);
//in_addr to string:
NSString*broadCastAddress=[NSString stringWithUTF8String:inet_ntoa(localAddr)];

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

有一个描述网络主机的IFADRS结构。它提供了任何网络接口的完整细节。通过使用
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;
}
#导入//查找本地IP所需的接口地址
静态NSString*广播地址()
//通过Wifi获取设备的本地IP
//计算并返回网络的广播地址
{
NSString*broadcastAddr=@“错误”;
struct ifaddrs*interfaces=NULL;
结构ifaddrs*临时地址=NULL;
int成功=0;
//检索当前接口-成功时返回0
success=getifaddrs(&interfaces);
如果(成功==0)
{
临时地址=接口;
while(临时地址!=NULL)
{
//检查接口是否为en0,这是iPhone上的wifi连接
如果(临时地址->ifa地址->sa家庭==AF家庭)
{
如果([[NSString stringWithUTF8String:temp_addr->ifa_name]是等效字符串:@“en0”])
{
broadcastAddr=[NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in*)temp_addr->ifa_dstaddr)->sin_addr)];
}
}
临时地址=临时地址->ifa\U下一步;
}
}
freeifaddrs(接口);
返回广播地址;
}
了解更多有关IFADRS结构的信息