C語言中判斷兩個(gè)IPv4地址是否屬于同一個(gè)子網(wǎng)的代碼
問題描述:
現(xiàn)給定兩個(gè)IPv4地址,和一個(gè)子網(wǎng)掩碼,判斷是否屬于同一個(gè)子網(wǎng),若屬于,輸出1,否則輸出0。
例如輸入:
172.16.1.3
172.16.1.35
255.255.255.224
輸出:
0
解決方案:
首先將字符串格式的IP地址轉(zhuǎn)化為4字節(jié)的IP地址,然后使用與(&)運(yùn)算,分別將兩個(gè)IP地址與掩碼相與,若最后的值相同,則為同一個(gè)子網(wǎng),否則不是。
以下函數(shù)的作用是將字符串格式的IP轉(zhuǎn)化為4字節(jié)的IP(因?yàn)槭?字節(jié),所以使用int,但不同平臺(tái)的int所占的字節(jié)好像不同哈~不太確定)
int _to_int(char * str, int start_idx, int end_idx) { int a = 0, i; for (i = start_idx; i <= end_idx; ++i) { a = a * 10 + (str[i] - '0'); } return a; } /* * 將ip字符串轉(zhuǎn)化為4字節(jié)的整形 */ int ip_to_int(char * ip) { int start = 0, i = 0, ret = 0; int shift_factor = 3; // 一開始要向右移動(dòng)3 * 8位 char c; while (c = ip[i]) { if (c == '.') { int a = _to_int(ip, start, i - 1); int temp = shift_factor * 8; ret = ret | (a << temp); shift_factor--; start = i + 1; } i++; } return ret; }
_to_int()函數(shù)的作用是將一段字符串轉(zhuǎn)化為數(shù)字,實(shí)際上就是將點(diǎn)分隔的字符串轉(zhuǎn)化為數(shù)字,ip_to_int()函數(shù)將字符串格式的ip轉(zhuǎn)化為整形。
以下是ip地址與子網(wǎng)掩碼運(yùn)算的部分:
#include <stdio.h> int main() { char a1[15], a2[15], a3[15]; gets(a1); gets(a2); gets(a3); int ip1 = ip_to_int(a1); int ip2 = ip_to_int(a2); int ip3 = ip_to_int(a3); int result = 0; if ((ip1 & ip3) == (ip2 & ip3)) { result = 1; } printf("%d", result); return 0; }
下面是其它網(wǎng)友的補(bǔ)充
題目描述
子網(wǎng)掩碼是用來判斷任意兩臺(tái)計(jì)算機(jī)的IP地址是否屬于同一子網(wǎng)絡(luò)的根據(jù)。
子網(wǎng)掩碼與IP地址結(jié)構(gòu)相同,是32位二進(jìn)制數(shù),其中網(wǎng)絡(luò)號(hào)部分全為“1”和主機(jī)號(hào)部分全為“0”。利用子網(wǎng)掩碼可以判斷兩臺(tái)主機(jī)是否中同一子網(wǎng)中。若兩臺(tái)主機(jī)的IP地址分別與它們的子網(wǎng)掩碼相“與”后的結(jié)果相同,則說明這兩臺(tái)主機(jī)在同一子網(wǎng)中。
示例:
I P 地址 192.168.0.1
子網(wǎng)掩碼 255.255.255.0
轉(zhuǎn)化為二進(jìn)制進(jìn)行運(yùn)算:
I P 地址 11010000.10101000.00000000.00000001
子網(wǎng)掩碼 11111111.11111111.11111111.00000000
AND運(yùn)算
11000000.10101000.00000000.00000000
轉(zhuǎn)化為十進(jìn)制后為:
192.168.0.0
I P 地址 192.168.0.254
子網(wǎng)掩碼 255.255.255.0
轉(zhuǎn)化為二進(jìn)制進(jìn)行運(yùn)算:
I P 地址 11010000.10101000.00000000.11111110
子網(wǎng)掩碼 11111111.11111111.11111111.00000000
AND運(yùn)算
11000000.10101000.00000000.00000000
轉(zhuǎn)化為十進(jìn)制后為:
192.168.0.0
通過以上對(duì)兩臺(tái)計(jì)算機(jī)IP地址與子網(wǎng)掩碼的AND運(yùn)算后,我們可以看到它運(yùn)算結(jié)果是一樣的。均為192.168.0.0,所以這二臺(tái)計(jì)算機(jī)可視為是同一子網(wǎng)絡(luò)。
/*
* 功能: 判斷兩臺(tái)計(jì)算機(jī)IP地址是同一子網(wǎng)絡(luò)。
* 輸入?yún)?shù): String Mask: 子網(wǎng)掩碼,格式:“255.255.255.0”;
* String ip1: 計(jì)算機(jī)1的IP地址,格式:“192.168.0.254”;
* String ip2: 計(jì)算機(jī)2的IP地址,格式:“192.168.0.1”;
*
* 返回值: 0:IP1與IP2屬于同一子網(wǎng)絡(luò); 1:IP地址或子網(wǎng)掩碼格式非法; 2:IP1與IP2不屬于同一子網(wǎng)絡(luò)
*/
public int checkNetSegment(String mask, String ip1, String ip2)
{
/*在這里實(shí)現(xiàn)功能*/
return 0;
}
輸入描述:
輸入子網(wǎng)掩碼、兩個(gè)ip地址
輸出描述:
得到計(jì)算結(jié)果
輸入例子:
255.255.255.0
192.168.224.256
192.168.10.4
輸出例子:
1
解答代碼:
#include<iostream> #include<fstream> #include<string> #include<cstring> #include<cctype> #include<algorithm> #include<cstdlib> using namespace std; typedef struct ip { int first; int second; int three; } IP; int judgeIp(string ipSubNet,IP &ip) { int index=0; ip.first=atoi(&ipSubNet[index]); if(ip.first>255) return 0; index++; index=ipSubNet.find_first_of('.',index); ip.second=atoi(&ipSubNet[++index]); if(ip.second>255) return 0; index++; index=ipSubNet.find_first_of('.',index); ip.three=atoi(&ipSubNet[++index]); if(ip.three>255) return 0; index++; index=ipSubNet.find_first_of('.',index); ip.fouth=atoi(&ipSubNet[++index]); if(ip.fouth>255) return 0; return 1; } int main() { string ipSubNet,ipAdd1,ipAdd2; IP subNet,ip1,ip2; while(cin>>ipSubNet>>ipAdd1>>ipAdd2) { if(judgeIp(ipSubNet,subNet)&&judgeIp(ipAdd1,ip1)&&judgeIp(ipAdd2,ip2)) { ip1.first=ip1.first & subNet.first; ip1.second=ip1.first & subNet.second; ip1.second=ip1.first & subNet.second; ip1.fouth=ip1.first & subNet.fouth; ip2.first=ip2.first & subNet.first; ip2.second=ip2.first & subNet.second; ip2.second=ip2.first & subNet.second; ip2.fouth=ip2.first & subNet.fouth; if(ip1.first==ip2.first&&ip1.second==ip2.second&&ip1.three==ip2.three&&ip1.fouth==ip2.fouth) cout<<'0'<<endl; else cout<<'2'<<endl; } else cout<<'1'<<endl; } return 0; }
C語言——如何判斷兩個(gè)IP在同一網(wǎng)段
ip_addr.h #define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \ (mask)->addr) == \ ((addr2)->addr & \ (mask)->addr))
在程序中,那個(gè)“\”表示它之前的程序和后面的是連接的,下一行和上一行是一個(gè)語句, 反斜杠符號(hào)起到長(zhǎng)代碼分行書寫功能。
注意:C語言中的關(guān)鍵字不可以用“\”分行!
到這里,這篇關(guān)于C語言中判斷ip是否在同一子網(wǎng)的文章就結(jié)束到這。
相關(guān)文章
C++實(shí)現(xiàn)LeetCode(78.子集合)
這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(78.子集合),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下2021-07-07詳解C++中賦值,關(guān)系,函數(shù)調(diào)用運(yùn)算符重載的實(shí)現(xiàn)
本文主要為大家講解一下三個(gè)C++中的運(yùn)算符重載,分別是賦值運(yùn)算符重載、關(guān)系運(yùn)算符重載和函數(shù)調(diào)用運(yùn)算符重載,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-06-06C語言實(shí)現(xiàn)實(shí)時(shí)鐘表
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)實(shí)時(shí)鐘表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05C基礎(chǔ) 尋找隨機(jī)函數(shù)的G點(diǎn)詳解
下面小編就為大家?guī)硪黄狢基礎(chǔ) 尋找隨機(jī)函數(shù)的G點(diǎn)詳解。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06詳解state狀態(tài)模式及在C++設(shè)計(jì)模式編程中的使用實(shí)例
這篇文章主要介紹了state狀態(tài)模式及在C++設(shè)計(jì)模式編程中的使用實(shí)例,在設(shè)計(jì)模式中策略用來處理算法變化,而狀態(tài)則是透明地處理狀態(tài)變化,需要的朋友可以參考下2016-03-03簡(jiǎn)要解讀C++的動(dòng)態(tài)和靜態(tài)關(guān)聯(lián)以及虛析構(gòu)函數(shù)
這篇文章主要介紹了簡(jiǎn)要解讀C++的動(dòng)態(tài)和靜態(tài)關(guān)聯(lián)以及虛析構(gòu)函數(shù),析構(gòu)函數(shù)在C++編程中平時(shí)并不是太常用,需要的朋友可以參考下2015-09-09使用C語言編寫一個(gè)強(qiáng)制關(guān)機(jī)程序
這篇文章主要為大家詳細(xì)介紹了如何使用C語言實(shí)現(xiàn)一個(gè)簡(jiǎn)單的"流氓軟件",一個(gè)可以強(qiáng)制關(guān)機(jī)惡作劇關(guān)機(jī)程序,輸入指定指令才可以解除,感興趣的小伙伴可以學(xué)習(xí)一下2023-11-11大家注意vector, list, set, map成員函數(shù)erase
set和map是由紅黑樹來實(shí)現(xiàn)的,當(dāng)erase的時(shí)候迭代器就失效了,也就是說我們要在迭代器失效之前保留一個(gè)副本,根據(jù)這個(gè)副本我們才能繼續(xù)遍歷下一個(gè)元素2013-09-09