根据子网掩码判断两个IP是否在同个子网

因项目需求,手机需与设备进行socket连接,连接前需判断手机网络和设备网络是否处于同个子网内。网络搜索无果后,自己根据逻辑写了个粗糙的判断方法,希望能帮助到有需要的人。首篇文章,如有错误,欢迎指正。Thanks♪(・ω・)ノ

获取手机当前IP地址

#pragma mark - 获取IP地址

+(NSString *)getIPAddress {
    NSString *address = @"error";
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    // 检索当前接口,在成功时,返回0
    success = getifaddrs(&interfaces);
    if (success == 0) {
        // 循环链表的接口
        temp_addr = interfaces;
        while(temp_addr != NULL) {
            if(temp_addr->ifa_addr->sa_family == AF_INET) {
                // 检查接口是否en0 wifi连接在iPhone上
                if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
                    // 得到NSString从C字符串
                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_addr)->sin_addr)];
                }
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    // 释放内存
    freeifaddrs(interfaces);
    return address;
}

获取子网掩码

#pragma mark - 获取子网掩码

+ (NSString*)getCurrentWifiMessage {
    NSString *address = nil;
    NSString *subNetMask = nil;
    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) {
        // Loop through linked list of interfaces
        temp_addr = interfaces;
        while(temp_addr != NULL) {
            if(temp_addr->ifa_addr->sa_family == AF_INET) {
                // Check if interface is en0 which is the wifi connection on the iPhone
                if([[NSString stringWithUTF8String:temp_addr->ifa_name] isEqualToString:@"en0"]) {
                    address = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)];
                    subNetMask = [NSString stringWithUTF8String:inet_ntoa(((struct sockaddr_in *)temp_addr->ifa_netmask)->sin_addr)];
                }
            }
            temp_addr = temp_addr->ifa_next;
        }
    }
    // Free memory
    freeifaddrs(interfaces);
    return subNetMask;
}

十进制转二进制

#pragma mark - 十进制转二进制

+ (NSString *)getBinaryByHex:(NSInteger)decimal {
    NSString *binary = @"";
    while (decimal) {
        binary = [[NSString stringWithFormat:@"%ld", decimal % 2] stringByAppendingString:binary];
        if (decimal / 2 < 1) {
            break;
        }
        decimal = decimal / 2 ;
    }
    if (binary.length % 4 != 0) {
        NSMutableString *mStr = [[NSMutableString alloc]init];;
        for (int i = 0; i < 4 - binary.length % 4; i++) {
            [mStr appendString:@"0"];
        }
        binary = [mStr stringByAppendingString:binary];
    }
    return binary;
}

获取某个字符在字符串中的所有位置数组

#pragma mark - 获取某个字符在字符串中的所有位置数组

+ (NSMutableArray *)getRangeStr:(NSString *)text findText:(NSString *)findText {
    NSMutableArray *arrayRanges = [NSMutableArray arrayWithCapacity:3];
    if (findText == nil && [findText isEqualToString:@""]) {
        return nil;
    }
    NSRange rang = [text rangeOfString:findText]; //获取第一次出现的range
    if (rang.location != NSNotFound && rang.length != 0) {
        [arrayRanges addObject:[NSNumber numberWithInteger:rang.location]];//将第一次的加入到数组中
        NSRange rang1 = {0,0};
        NSInteger location = 0;
        NSInteger length = 0;
        for (int i = 0;; i++) {
            if (0 == i)  {
                //去掉这个abc字符串
                location = rang.location + rang.length;
                length = text.length - rang.location - rang.length;
                rang1 = NSMakeRange(location, length);
            } else {
                location = rang1.location + rang1.length;
                length = text.length - rang1.location - rang1.length;
                rang1 = NSMakeRange(location, length);
            }
            //在一个range范围内查找另一个字符串的range
            rang1 = [text rangeOfString:findText options:NSCaseInsensitiveSearch range:rang1];
            if (rang1.location == NSNotFound && rang1.length == 0) {
                break;
            } else//添加符合条件的location进数组
                [arrayRanges addObject:[NSNumber numberWithInteger:rang1.location]];
        }
        return arrayRanges;
    }
    return nil;
}

获取IP或者子网掩码每段的二进制字符串

#pragma mark - 获取IP和子网掩码每段的二进制

+ (NSArray *)fetchBinaryListWithStr:(NSString *)string {
    NSArray *maskPositionList = [self getRangeStr:string findText:@"."];
    NSMutableArray *maskList = [[NSMutableArray alloc] init];
    for (int i = 0; i < [maskPositionList count]; i++) {
        NSString *str;
        if (i == 0) {
            str = [self getBinaryByHex:[[string substringWithRange:NSMakeRange(0, [[maskPositionList objectAtIndex:i] integerValue])] integerValue]];
        } else {
            str = [self getBinaryByHex:[[string substringWithRange:NSMakeRange([[maskPositionList objectAtIndex:i-1] integerValue] + 1, [[maskPositionList objectAtIndex:i] integerValue] - [[maskPositionList objectAtIndex:i-1] integerValue] - 1)] integerValue]];
        }
        for (int i = (int)str.length; i < 12; i++) {
            str = [NSString stringWithFormat:@"0%@",str];
        }
        [maskList addObject:str];
    }
    NSString *lastStr = [self getBinaryByHex:[[string substringWithRange:NSMakeRange([[maskPositionList objectAtIndex:[maskPositionList count] - 1] integerValue] + 1, string.length - [[maskPositionList objectAtIndex:[maskPositionList count] - 1] integerValue] - 1)] integerValue]];
    for (int i = (int)lastStr.length; i < 12; i++) {
        lastStr = [NSString stringWithFormat:@"0%@",lastStr];
    }
    [maskList addObject:lastStr];
    return maskList;
}

二进制的&运算

#pragma mark - 二进制与运算

+ (NSString *)andOperationWithFirst:(NSString *)first andSecond:(NSString *)second {
    NSString *resultStr = nil;
    for (int i = 0; i < first.length; i++) {
        if (i == 0) {
            if ([[first substringWithRange:NSMakeRange(0, 1)] integerValue] == 1 && [[second substringWithRange:NSMakeRange(0, 1)] integerValue] == 1) {
                resultStr = [NSString stringWithFormat:@"1"];
            } else {
                resultStr = [NSString stringWithFormat:@"0"];
            }
        } else {
            if ([[first substringWithRange:NSMakeRange(i, 1)] integerValue] == 1 && [[second substringWithRange:NSMakeRange(i, 1)] integerValue] == 1) {
                resultStr = [NSString stringWithFormat:@"%@1",resultStr];
            } else {
                resultStr = [NSString stringWithFormat:@"%@0",resultStr];
            }
        }
    }
    return resultStr;
}

二进制转十进制

+ (NSString *)getDecimalByBinary:(NSString *)binary {
    NSInteger decimal = 0;
    for (int i = 0; i < binary.length; i++) {
        NSString *number = [binary substringWithRange:NSMakeRange(binary.length - i - 1, 1)];
        if ([number isEqualToString:@"1"]) {
            decimal += pow(2, i);
        }
    }
    return [NSString stringWithFormat:@"%ld",(long)decimal];
}

判断IP是否在同个子网内

+ (BOOL)whetherTheSameSubNetWithDeviceIpStr:(NSString *)deviceIp {
    BOOL result = NO;
    //子网掩码
    NSString *mask = [UtilsMacro getCurrentWifiMessage];
    NSArray *maskList = [UtilsMacro fetchBinaryListWithStr:mask];
    //手机IP地址
    NSString *currentIP = [UtilsMacro getIPAddress];
    NSArray *ipList = [UtilsMacro fetchBinaryListWithStr:currentIP];
    
    NSArray *deviceList = [UtilsMacro fetchBinaryListWithStr:deviceIp];
    
    NSMutableArray *deviceAndResult = [[NSMutableArray alloc] init];
    NSMutableArray *phoneAndResult = [[NSMutableArray alloc] init];
    for (int i = 0; i < [maskList count]; i++) {
        [deviceAndResult addObject:[UtilsMacro getDecimalByBinary:[UtilsMacro andOperationWithFirst:[maskList objectAtIndex:i] andSecond:[deviceList objectAtIndex:i]]]];
        [phoneAndResult addObject:[UtilsMacro getDecimalByBinary:[UtilsMacro andOperationWithFirst:[maskList objectAtIndex:i] andSecond:[ipList objectAtIndex:i]]]];
    }
    
    NSString *deviceResult = [deviceAndResult componentsJoinedByString:@"."];
    NSLog(@"deviceResult:%@",deviceResult);
    NSString *phoneResult = [phoneAndResult componentsJoinedByString:@"."];
    NSLog(@"phoneResult:%@",phoneResult);
    if ([deviceResult isEqualToString:phoneResult]) {
        result = YES;
    } else {
        result = NO;
    }
    return result;
}
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容

  • 1、概念简介 子网掩码子网掩码又叫网络掩码、地址掩码,是一个32位地址,用于屏蔽IP地址的一部分以区别网络号和主机...
    黒猫阅读 7,637评论 0 23
  • 名词延伸 通俗的说,域名就相当于一个家庭的门牌号码,别人通过这个号码可以很容易的找到你。如果把IP地址比作一间房子...
    杨大虾阅读 20,599评论 2 57
  • 转自:http://zhoutao.blog.51cto.com/425866/93629 网络管理中的IP地址、...
    ALEXIRC阅读 8,714评论 0 31
  • 1.这篇文章不是本人原创的,只是个人为了对这部分知识做一个整理和系统的输出而编辑成的,在此郑重地向本文所引用文章的...
    SOMCENT阅读 13,060评论 6 174
  • 引言 我先抛出一个简单的问题。 我所在的公司启用的是独立IP地址,公司下的所有电脑都在一个局域网内,然从每台计算机...
    OzanShareing阅读 5,303评论 2 23