3

C#/.NET 2.0 で次のことを達成しようとしています。

IPAddress オブジェクト (たとえば、192.168.127.100) と、IPv4Mask/サブネット マスク (たとえば、255.255.248.0) を含む別の IPAddress オブジェクトが与えられた場合、IP アドレス範囲の開始と終了を計算できるはずです。

(はい、サブネット上のアドレスの範囲を介して for ループを実行しようとしています。)

理論的には、IPAddress と SubnetMask のビットごとの AND を実行して、IPStart を取得できるはずです。次に、IPStart と反転された (NOT'd) SubnetMask でビットごとの XOR を実行して、IPEnd を取得できるはずです。

IPAddress オブジェクトは、アドレスを「long」または「byte[]」(バイト配列) として出力するメソッドを提供します。

long に対してビット演算を実行すると (署名されているため?)、無効な結果が生成されます。また、バイト配列として IPAddresses に対してビット単位の操作を実行できないようです。

EDIT-1: わかりました、配列内の各バイトをループし、ビット単位の AND、NOT、および XOR を (それぞれの状況で) 実行すると、正しい結果が得られます。

私が直面している次の問題は、byte[] 配列を UInt32 または long に変換した後、for ループを簡単に実行できないことです。したがって、最初の値は適切に機能しますが、uint/long を 1 ずつ増やすと、IP アドレスが 192.168.127.0 から 193.168.127.0 に増加します。byte[] 配列が uint/long に変換された後、バイトが反転します。そのため、IPStart から IPEnd にインクリメントする簡単な方法はありません。

何か提案はありますか?

4

4 に答える 4

3

2 つの byte[] 配列を一緒にクロールし、ビット ペアごとにビットごとの比較を実行し、結果を範囲開始の 3 番目の byte[] 配列に配置します。ネットワーク アドレスの byte[] 配列をクロールし、各ビットを反転してワイルドカード マスクを生成し (サブネット マスクを反転したものと呼んでいます)、サブネット マスクの代わりにワイルドカード マスクを使用して前と同じようにプロセスを繰り返し、レンジエンド。また、範囲の最初の値はサブネット ネットワーク アドレスで、最後の値はブロードキャスト アドレスであるため、これら 2 つのアドレスは実際のホスト アドレス範囲に含まれていないことに注意してください。ステップバイステップの要約の例を次に示します。

Address:   192.168.127.100       11000000.10101000.01111 111.01100100
Netmask:   255.255.248.0 = 21    11111111.11111111.11111 000.00000000
Wildcard:  0.0.7.255             00000000.00000000.00000 111.11111111
=>
Network:   192.168.120.0/21      11000000.10101000.01111 000.00000000
Broadcast: 192.168.127.255       11000000.10101000.01111 111.11111111
HostMin:   192.168.120.1         11000000.10101000.01111 000.00000001
HostMax:   192.168.127.254       11000000.10101000.01111 111.11111110
于 2009-06-15T16:05:24.447 に答える
2

BitConverterを使用して、これらの配列を uint に変換できます。

これを試して:

uint address = BitConverter.ToUInt32(IPAddress.Parse("192.168.127.100").GetAddressBytes(), 0);
uint mask = BitConverter.ToUInt32(IPAddress.Parse("255.255.248.0").GetAddressBytes(), 0);
于 2009-06-15T15:55:55.247 に答える
1

http://ipnetwork.codeplex.com/

サンプルコード:

var network = IPNetwork.Parse("192.168.1.0/29");
var addresses = IPNetwork.ListIPAddress(network);

foreach (var ip in addresses) {
    Console.WriteLine("{0}", ip);
}
于 2011-03-16T04:36:15.867 に答える
1

あなたは正しい道を進んでいます。配列内の各バイトを個別に扱うだけです。

于 2009-06-15T15:51:37.297 に答える