10.132.0.0/20の形式のサブネットと、ASP.Net要求オブジェクトからのIPアドレスがあります。
IPアドレスが指定されたサブネット内にあるかどうかを確認するための.NETFramework関数はありますか?
そうでない場合、どのようにそれを行うことができますか?ビット操作だと思いますか?
10.132.0.0/20の形式のサブネットと、ASP.Net要求オブジェクトからのIPアドレスがあります。
IPアドレスが指定されたサブネット内にあるかどうかを確認するための.NETFramework関数はありますか?
そうでない場合、どのようにそれを行うことができますか?ビット操作だと思いますか?
MSDN ブログの C# を使用したIP アドレスの計算を参照してください。IsInSameSubnet
これには、ニーズを満たす拡張メソッド ( ) とその他の機能が含まれています。
public static class IPAddressExtensions
{
public static IPAddress GetBroadcastAddress(this IPAddress address, IPAddress subnetMask)
{
byte[] ipAdressBytes = address.GetAddressBytes();
byte[] subnetMaskBytes = subnetMask.GetAddressBytes();
if (ipAdressBytes.Length != subnetMaskBytes.Length)
throw new ArgumentException("Lengths of IP address and subnet mask do not match.");
byte[] broadcastAddress = new byte[ipAdressBytes.Length];
for (int i = 0; i < broadcastAddress.Length; i++)
{
broadcastAddress[i] = (byte)(ipAdressBytes[i] | (subnetMaskBytes[i] ^ 255));
}
return new IPAddress(broadcastAddress);
}
public static IPAddress GetNetworkAddress(this IPAddress address, IPAddress subnetMask)
{
byte[] ipAdressBytes = address.GetAddressBytes();
byte[] subnetMaskBytes = subnetMask.GetAddressBytes();
if (ipAdressBytes.Length != subnetMaskBytes.Length)
throw new ArgumentException("Lengths of IP address and subnet mask do not match.");
byte[] broadcastAddress = new byte[ipAdressBytes.Length];
for (int i = 0; i < broadcastAddress.Length; i++)
{
broadcastAddress[i] = (byte)(ipAdressBytes[i] & (subnetMaskBytes[i]));
}
return new IPAddress(broadcastAddress);
}
public static bool IsInSameSubnet(this IPAddress address2, IPAddress address, IPAddress subnetMask)
{
IPAddress network1 = address.GetNetworkAddress(subnetMask);
IPAddress network2 = address2.GetNetworkAddress(subnetMask);
return network1.Equals(network2);
}
}
ビット操作が機能します。IP を 32 ビットの符号なし整数に詰め込み、サブネットのアドレスで同じことを行い、&
-mask0xFFFFFFFF << (32-20)
と比較します。
unsigned int net = ..., ip = ...;
int network_bits = 20;
unsigned int mask = 0xFFFFFFFF << (32 - network_bits);
if ((net & mask) == (ip & mask)) {
// ...
}
System.Net.IPAddress
解決策は、アドレス、サブネット、およびマスク オクテットを使用して IP アドレスをバイトに変換し、ビットごとの比較を実行することです。
二項 AND 演算子&
は、両方のオペランドに存在する場合、ビットを結果にコピーします。
コード:
using System.Net; // Used to access IPAddress
bool IsAddressOnSubnet(string address, string subnet, string mask)
{
try
{
IPAddress Address = IPAddress.Parse(address);
IPAddress Subnet = IPAddress.Parse(subnet);
IPAddress Mask = IPAddress.Parse(mask);
Byte[] addressOctets = Address.GetAddressBytes();
Byte[] subnetOctets = Mask.GetAddressBytes();
Byte[] networkOctets = Subnet.GetAddressBytes();
return
((networkOctets[0] & subnetOctets[0]) == (addressOctets[0] & subnetOctets[0])) &&
((networkOctets[1] & subnetOctets[1]) == (addressOctets[1] & subnetOctets[1])) &&
((networkOctets[2] & subnetOctets[2]) == (addressOctets[2] & subnetOctets[2])) &&
((networkOctets[3] & subnetOctets[3]) == (addressOctets[3] & subnetOctets[3]));
}
catch (System.Exception ex)
{
return false;
}
}
参照に感謝し ます