IP範囲がaaa.bbb.ccc.ddd/netmask(CIDR表記)と記述されている場合、この範囲に含まれる最初と最後のIPアドレスをC#で計算する必要があります。
例:
入力: 192.168.0.1 / 25
結果: 192.168.0.1-192.168.0.126
私の親友のAlessandroは、 C#のビット演算子に関する素晴らしい投稿をしています。何をすべきかを理解するために、それについて読む必要があります。
とても簡単です。与えられたIPをバイナリに分解すると、ネットワークアドレスはすべてのホストビット(サブネットマスクの0)が0であるIPアドレスであり、最後のアドレスであるブロードキャストアドレスはすべてのホストが存在するIPアドレスです。ビットは1です。
例えば:
ip 192.168.33.72 mask 255.255.255.192
11111111.11111111.11111111.11000000 (subnet mask)
11000000.10101000.00100001.01001000 (ip address)
太字の部分はHOSTビットです(残りはネットワークビットです)。IPですべてのホストビットを0にすると、最初の可能なIPが得られます。
11000000.10101000.00100001.01000000 (192.168.33.64)
すべてのホストビットを1にすると、最後の可能なIP(別名ブロードキャストアドレス)が得られます。
11000000.10101000.00100001.01111111 (192.168.33.127)
だから私の例では:
the network is "192.168.33.64/26":
Network address: 192.168.33.64
First usable: 192.168.33.65 (you can use the network address, but generally this is considered bad practice)
Last useable: 192.168.33.126
Broadcast address: 192.168.33.127
コードを投稿します:
IPAddress ip = new IPAddress(new byte[] { 192, 168, 0, 1 });
int bits = 25;
uint mask = ~(uint.MaxValue >> bits);
// Convert the IP address to bytes.
byte[] ipBytes = ip.GetAddressBytes();
// BitConverter gives bytes in opposite order to GetAddressBytes().
byte[] maskBytes = BitConverter.GetBytes(mask).Reverse().ToArray();
byte[] startIPBytes = new byte[ipBytes.Length];
byte[] endIPBytes = new byte[ipBytes.Length];
// Calculate the bytes of the start and end IP addresses.
for (int i = 0; i < ipBytes.Length; i++)
{
startIPBytes[i] = (byte)(ipBytes[i] & maskBytes[i]);
endIPBytes[i] = (byte)(ipBytes[i] | ~maskBytes[i]);
}
// Convert the bytes to IP addresses.
IPAddress startIP = new IPAddress(startIPBytes);
IPAddress endIP = new IPAddress(endIPBytes);
マスクを反転し(XORと1)、IPと反転します。1を追加します。これが開始範囲になります。またはマスク付きIP。これが終了範囲になります。
このショートカットは、ネットワーク展開の位置での作業から学びました。それは私をとても助けてくれました、私はこの秘密をみんなと共有するつもりだと思いました。これまでのところ、私が知っているオンラインでのより簡単な方法を見つけることができませんでした。
たとえば、ネットワーク192.115.103.64 / 27の場合、範囲はどのくらいですか?
サブネットマスクは0、128、192、224、240、248、252、254、255であることを覚えておいてください
255.255.255.255 11111111.11111111.11111111.11111111 / 32
255.255.255.254 11111111.11111111.11111111.11111110 / 31
255.255.255.252 11111111.11111111.11111111.11111100 / 30
255.255.255.248 11111111.11111111.11111111.11111000 / 29
255.255.255.240 11111111.11111111.11111111.11110000 / 28
255.255.255.224 11111111.11111111.11111111.11100000 / 27
255.255.255.192 11111111.11111111.11111111.11000000 / 26
255.255.255.128 11111111.11111111.11111111.10000000 / 25
255.255.255.0 11111111.11111111.11111111.00000000 / 24
/ 27から、(11111111.11111111.11111111.11100000)であることがわかります。左から数えて、最後のオクテットから3番目の数値であり、255.255.255.224サブネットマスクに相当します。(0を数えないでください。0は/ 24です)したがって、128、192、224など。
ここで数学が登場します:
サブネットマスクを使用します-この場合、前にリストされたサブネットマスクのサブネットマスク224-192 = 32
192.115.103.64がネットワークであることがわかっています:64 + 32 = 96(/ 27の次のネットワーク)
これは、.0.32があることを意味します。64. 96. 128. 160. 192. 224.(.255であるため256は使用できません)
これが64〜96の範囲です。
ネットワークは64です。
最初のホストは65です。(最初のネットワーク+1)
最後のホストは94です。(ブロードキャスト-1)
ブロードキャストは95です。(最後のネットワーク-1)
IPNetworkライブラリhttps://github.com/lduchosal/ipnetworkの使用をお勧めします。バージョン2では、IPv4とIPv6もサポートしています。
IPv4
IPNetwork ipnetwork = IPNetwork.Parse("192.168.0.1/25");
Console.WriteLine("Network : {0}", ipnetwork.Network);
Console.WriteLine("Netmask : {0}", ipnetwork.Netmask);
Console.WriteLine("Broadcast : {0}", ipnetwork.Broadcast);
Console.WriteLine("FirstUsable : {0}", ipnetwork.FirstUsable);
Console.WriteLine("LastUsable : {0}", ipnetwork.LastUsable);
Console.WriteLine("Usable : {0}", ipnetwork.Usable);
Console.WriteLine("Cidr : {0}", ipnetwork.Cidr);
出力
Network : 192.168.0.0
Netmask : 255.255.255.128
Broadcast : 192.168.0.127
FirstUsable : 192.168.0.1
LastUsable : 192.168.0.126
Usable : 126
Cidr : 25
楽しむ !
入力:192.168.0.1/25
マスクはこの部分です:/25
ネットワークアドレスを見つけるには、次の手順を実行します。
IPの長さ(32-マスク)= 32-25 = 7からマスクを減算し、それらのビットを右から取得します
与えられたIPアドレスですなわち:192.168.0.1
バイナリで:
11111111 11111111 00000000 00000001
今、右から7ビットを取る '0'
1111111 11111111 00000000 00000000
これは10進数で:(
192.168.0.0
これはネットワークアドレスです)
最初の有効/使用可能なIPアドレスを見つけるには、ネットワークアドレスに+1を追加します。192.168.0.1
最後の/ブロードキャストアドレスを見つける手順は、ネットワークアドレスを見つける手順と同じですが、ここでは、右から「1」までの(32マスク)ビットを作成する必要があります。
すなわち:11111111 11111111 00000000 01111111
10進数でどれですか192.168.0.127
最後の有効/使用可能なIPアドレスを見つけるには、ブロードキャストアドレスから1を引きます。192.168.0.126
あなたはすでにこれを知っているかもしれませんが、あなたがこれを正しく理解していることを確認するには、http://www.subnet-calculator.com/を見てください-ビットがアドレスのネットワークとホスト部分をどのように表すかを見ることができます。
これは古い質問ですが、nugetでこの気の利いたライブラリを見つけました。これは、私にとってはトリックにすぎないようです。