根據(jù)子網(wǎng)掩碼判斷兩個IP是否在同個子網(wǎng)

因項目需求缴淋,手機需與設(shè)備進行socket連接资厉,連接前需判斷手機網(wǎng)絡(luò)和設(shè)備網(wǎng)絡(luò)是否處于同個子網(wǎng)內(nèi)。網(wǎng)絡(luò)搜索無果后罢吃,自己根據(jù)邏輯寫了個粗糙的判斷方法楚午,希望能幫助到有需要的人。首篇文章尿招,如有錯誤矾柜,歡迎指正。Thanks?(?ω?)?

獲取手機當(dāng)前IP地址

#pragma mark - 獲取IP地址

+(NSString *)getIPAddress {
    NSString *address = @"error";
    struct ifaddrs *interfaces = NULL;
    struct ifaddrs *temp_addr = NULL;
    int success = 0;
    // 檢索當(dāng)前接口,在成功時,返回0
    success = getifaddrs(&interfaces);
    if (success == 0) {
        // 循環(huán)鏈表的接口
        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;
        }
    }
    // 釋放內(nèi)存
    freeifaddrs(interfaces);
    return address;
}

獲取子網(wǎng)掩碼

#pragma mark - 獲取子網(wǎng)掩碼

+ (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;
}

十進制轉(zhuǎn)二進制

#pragma mark - 十進制轉(zhuǎn)二進制

+ (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;
}

獲取某個字符在字符串中的所有位置數(shù)組

#pragma mark - 獲取某個字符在字符串中的所有位置數(shù)組

+ (NSMutableArray *)getRangeStr:(NSString *)text findText:(NSString *)findText {
    NSMutableArray *arrayRanges = [NSMutableArray arrayWithCapacity:3];
    if (findText == nil && [findText isEqualToString:@""]) {
        return nil;
    }
    NSRange rang = [text rangeOfString:findText]; //獲取第一次出現(xiàn)的range
    if (rang.location != NSNotFound && rang.length != 0) {
        [arrayRanges addObject:[NSNumber numberWithInteger:rang.location]];//將第一次的加入到數(shù)組中
        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范圍內(nèi)查找另一個字符串的range
            rang1 = [text rangeOfString:findText options:NSCaseInsensitiveSearch range:rang1];
            if (rang1.location == NSNotFound && rang1.length == 0) {
                break;
            } else//添加符合條件的location進數(shù)組
                [arrayRanges addObject:[NSNumber numberWithInteger:rang1.location]];
        }
        return arrayRanges;
    }
    return nil;
}

獲取IP或者子網(wǎng)掩碼每段的二進制字符串

#pragma mark - 獲取IP和子網(wǎng)掩碼每段的二進制

+ (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;
}

二進制轉(zhuǎn)十進制

+ (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是否在同個子網(wǎng)內(nèi)

+ (BOOL)whetherTheSameSubNetWithDeviceIpStr:(NSString *)deviceIp {
    BOOL result = NO;
    //子網(wǎng)掩碼
    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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末就谜,一起剝皮案震驚了整個濱河市怪蔑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丧荐,老刑警劉巖缆瓣,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異篮奄,居然都是意外死亡捆愁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門窟却,熙熙樓的掌柜王于貴愁眉苦臉地迎上來昼丑,“玉大人,你說我怎么就攤上這事夸赫∑械郏” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長呼奢。 經(jīng)常有香客問我宜雀,道長,這世上最難降的妖魔是什么握础? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任辐董,我火速辦了婚禮,結(jié)果婚禮上禀综,老公的妹妹穿的比我還像新娘简烘。我一直安慰自己,他們只是感情好定枷,可當(dāng)我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布孤澎。 她就那樣靜靜地躺著,像睡著了一般欠窒。 火紅的嫁衣襯著肌膚如雪覆旭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天岖妄,我揣著相機與錄音型将,去河邊找鬼。 笑死衣吠,一個胖子當(dāng)著我的面吹牛茶敏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播缚俏,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼惊搏,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了忧换?” 一聲冷哼從身側(cè)響起恬惯,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎亚茬,沒想到半個月后酪耳,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡刹缝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年碗暗,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片梢夯。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡言疗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颂砸,到底是詐尸還是另有隱情噪奄,我是刑警寧澤死姚,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站勤篮,受9級特大地震影響都毒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜碰缔,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一账劲、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧手负,春花似錦涤垫、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽切蟋。三九已至统捶,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間柄粹,已是汗流浹背喘鸟。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留驻右,地道東北人什黑。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像堪夭,于是被迫代替她去往敵國和親愕把。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,092評論 2 355

推薦閱讀更多精彩內(nèi)容