C言語では、二つのIPv 4アドレスが同じサブネットのコードに属するかどうかを判断する。
問題の説明:
今は二つのIPv 4アドレスと一つのサブネットマスクを与えて、同じサブネットに属するかどうかを判断します。
たとえば、入力:
172.6.1.3
172.1.61.35
255.255.255.224
出力:
0
ソリューション:
最初に文字列フォーマットのIPアドレスを4バイトのIPアドレスに変換し、その後は(&)演算を使用して、それぞれ2つのIPアドレスとマスクを一致させます。最後の値が同じなら、同じサブネットになります。そうでなければ違います。
以下の関数の役割は文字列フォーマットのIPを4バイトのIPに変換することです。
以下はipアドレスとサブネットマスク演算の部分です。
テーマの説明
サブネットマスクは、任意の2つのコンピュータのIPアドレスが同じサブネットに属するかどうかを判断するための根拠である。
サブネットマスクはIPアドレス構造と同じ32ビットのバイナリ数であり、ネットワーク番号の部分は全部「1」とホスト番号の部分は全部「0」である。サブネットマスクを利用して、2台のホストが同じサブネットにあるかどうかを判断できます。2台のホストのIPアドレスがそれぞれそれらのサブネットマスクと同じである場合、この2台のホストは同じサブネットにあると説明する。
例:
I Pアドレス192.168.0.1
サブネットマスク255.255.255.0
バイナリに変換して演算します。
I Pアドレス1101001000101010101000 000 000.0001
サブネットマスク11111111.11111111111111.11111.11111.0000
AND演算
1100000101000 000 000 000
十進数に変換したら、
192.168.0
I Pアドレス192.168.0.254
サブネットマスク255.255.255.0
バイナリに変換して演算します。
I Pアドレス11010010010001010101000 000.11110
サブネットマスク11111111.11111111111111.11111.11111.0000
AND演算
1100000101000 000 000 000
十進数に変換したら、
192.168.0
以上の2台のコンピュータIPアドレスとサブネットマスクのAND演算を通して、その演算結果は同じであることが分かります。192.168.00ですから、この2台のコンピュータは同じサブネットワークと見なされます。
/*
*機能:2台のコンピュータのIPアドレスが同じサブネットワークであると判断します。
*入力パラメータ:String Mask:サブネットマスク、フォーマット:「255.255.255.0」
*String ip 1:コンピュータ1のIPアドレス、フォーマット:192.168.0.254;
*String ip 2:コンピュータ2のIPアドレス、フォーマット:192.168.0.1;
*
*返却値:0:IP 1とIP 2は同じサブネットワークに属する。1:IPアドレスまたはサブネットマスクフォーマットが不正です。2:IP 1とIP 2は同じサブネットに属していません。
*/
public int checkNetSegment(String mark,String ip 1,String ip 2)
{
/*ここで機能を実現する*/
return 0;
)
説明を入力:
サブネットマスク、二つのipアドレスを入力します。
出力の説明:
計算結果を得る
入力例:
255.255.255.0
192.168.224.256
192.168.10.4
出力例:
1
解答コード:
注意:C言語のキーワードは「\」支店を使ってはいけません。
ここでは、C言語でipが同じサブネットにあるかどうかを判断する文章が終わります。
今は二つのIPv 4アドレスと一つのサブネットマスクを与えて、同じサブネットに属するかどうかを判断します。
たとえば、入力:
172.6.1.3
172.1.61.35
255.255.255.224
出力:
0
ソリューション:
最初に文字列フォーマットのIPアドレスを4バイトのIPアドレスに変換し、その後は(&)演算を使用して、それぞれ2つのIPアドレスとマスクを一致させます。最後の値が同じなら、同じサブネットになります。そうでなければ違います。
以下の関数の役割は文字列フォーマットのIPを4バイトのIPに変換することです。
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 4
*/
int ip_to_int(char * ip)
{
int start = 0, i = 0, ret = 0;
int shift_factor = 3; // 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()関数の役割は、一段の文字列を数字に変換することです。実際には、点を区切った文字列を数字に変換し、ip_to_int()関数は文字列書式のipを整形に変換します。以下はipアドレスとサブネットマスク演算の部分です。
#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;
}
以下は他のネット友達の補充です。テーマの説明
サブネットマスクは、任意の2つのコンピュータのIPアドレスが同じサブネットに属するかどうかを判断するための根拠である。
サブネットマスクはIPアドレス構造と同じ32ビットのバイナリ数であり、ネットワーク番号の部分は全部「1」とホスト番号の部分は全部「0」である。サブネットマスクを利用して、2台のホストが同じサブネットにあるかどうかを判断できます。2台のホストのIPアドレスがそれぞれそれらのサブネットマスクと同じである場合、この2台のホストは同じサブネットにあると説明する。
例:
I Pアドレス192.168.0.1
サブネットマスク255.255.255.0
バイナリに変換して演算します。
I Pアドレス1101001000101010101000 000 000.0001
サブネットマスク11111111.11111111111111.11111.11111.0000
AND演算
1100000101000 000 000 000
十進数に変換したら、
192.168.0
I Pアドレス192.168.0.254
サブネットマスク255.255.255.0
バイナリに変換して演算します。
I Pアドレス11010010010001010101000 000.11110
サブネットマスク11111111.11111111111111.11111.11111.0000
AND演算
1100000101000 000 000 000
十進数に変換したら、
192.168.0
以上の2台のコンピュータIPアドレスとサブネットマスクのAND演算を通して、その演算結果は同じであることが分かります。192.168.00ですから、この2台のコンピュータは同じサブネットワークと見なされます。
/*
*機能:2台のコンピュータのIPアドレスが同じサブネットワークであると判断します。
*入力パラメータ:String Mask:サブネットマスク、フォーマット:「255.255.255.0」
*String ip 1:コンピュータ1のIPアドレス、フォーマット:192.168.0.254;
*String ip 2:コンピュータ2のIPアドレス、フォーマット:192.168.0.1;
*
*返却値:0:IP 1とIP 2は同じサブネットワークに属する。1:IPアドレスまたはサブネットマスクフォーマットが不正です。2:IP 1とIP 2は同じサブネットに属していません。
*/
public int checkNetSegment(String mark,String ip 1,String ip 2)
{
/*ここで機能を実現する*/
return 0;
)
説明を入力:
サブネットマスク、二つのipアドレスを入力します。
出力の説明:
計算結果を得る
入力例:
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言語――どうやって二つのIPが同じセグメントにあるかを判断しますか?
ip_addr.h
#define ip_addr_netcmp(addr1, addr2, mask) (((addr1)->addr & \
(mask)->addr) == \
((addr2)->addr & \
(mask)->addr))
プログラムでは、その「\」は前のプログラムと後ろのプログラムが接続されていることを表しています。次の行と前の行は文で、逆の棒線記号は長いコードの支店に書く機能があります。注意:C言語のキーワードは「\」支店を使ってはいけません。
ここでは、C言語でipが同じサブネットにあるかどうかを判断する文章が終わります。