我已经通过创建一个函数来回答我的问题,该函数检查IP地址(IPv4或IPv6)是否是不可路由的IP地址。我已经参考了麦凯的帖子中引用的维基文章,找到了很多保留的IP地址。(
http://en.wikipedia.org/wiki/Reserved_IP_addresses)
解决方案:
public static bool IsNonRoutableIpAddress(string ipAddress)
{
if (String.IsNullOrEmpty(ipAddress))
{
return true;
}
IPAddress tempIpAddress = null;
if (!IPAddress.TryParse(ipAddress, out tempIpAddress))
{
return true;
}
byte[] ipAddressBytes = tempIpAddress.GetAddressBytes();
if (tempIpAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork)
{
if (IsIpAddressInRange(ipAddressBytes, "10.0.0.0/8"))
{
return true;
}
else if (IsIpAddressInRange(ipAddressBytes, "172.16.0.0/12"))
{
return true;
}
else if (IsIpAddressInRange(ipAddressBytes, "192.168.0.0/16"))
{
return true;
}
else if (IsIpAddressInRange(ipAddressBytes, "127.0.0.0/8"))
{
return true;
}
else if (IsIpAddressInRange(ipAddressBytes, "0.0.0.0/8"))
{
return true;
}
return false;
}
else if (tempIpAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6)
{
if (IsIpAddressInRange(ipAddressBytes, "::/128"))
{
return true;
}
else if (IsIpAddressInRange(ipAddressBytes, "::1/128"))
{
return true;
}
else if (IsIpAddressInRange(ipAddressBytes, "2001:db8::/32"))
{
return true;
}
return false;
}
else
{
return true;
}
}
private static bool IsIpAddressInRange(byte[] ipAddressBytes, string reservedIpAddress)
{
if (String.IsNullOrEmpty(reservedIpAddress))
{
return false;
}
if (ipAddressBytes == null)
{
return false;
}
string[] ipAddressSplit = reservedIpAddress.Split(new char[] { '/' }, StringSplitOptions.RemoveEmptyEntries);
if (ipAddressSplit.Length != 2)
{
return false;
}
string ipAddressRange = ipAddressSplit[0];
IPAddress ipAddress = null;
if (!IPAddress.TryParse(ipAddressRange, out ipAddress))
{
return false;
}
byte[] ipBytes = ipAddress.GetAddressBytes();
int bits = 0;
if (!int.TryParse(ipAddressSplit[1], out bits))
{
bits = 0;
}
byte[] maskBytes = null;
if (ipAddress.AddressFamily == AddressFamily.InterNetwork)
{
uint mask = ~(uint.MaxValue >> bits);
maskBytes = BitConverter.GetBytes(mask).Reverse().ToArray();
}
else if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6)
{
BitArray bitArray = new BitArray(128, false);
ShiftRight(bitArray, bits, true);
maskBytes = ConvertToByteArray(bitArray).Reverse().ToArray();
}
bool result = true;
for (int i = 0; i < ipBytes.Length; i++)
{
result &= (byte)(ipAddressBytes[i] & maskBytes[i]) == ipBytes[i];
}
return result;
}
private static void ShiftRight(BitArray bitArray, int shiftN, bool fillValue)
{
for (int i = shiftN; i < bitArray.Count; i++)
{
bitArray[i - shiftN] = bitArray[i];
}
for (int index = bitArray.Count - shiftN; index < bitArray.Count; index++)
{
bitArray[index] = fillValue;
}
}
private static byte[] ConvertToByteArray(BitArray bitArray)
{
int bytes = (bitArray.Length + 7) / 8;
byte[] arr2 = new byte[bytes];
int bitIndex = 0;
int byteIndex = 0;
for (int i = 0; i < bitArray.Length; i++)
{
if (bitArray[i])
{
arr2[byteIndex] |= (byte)(1 << bitIndex);
}
bitIndex++;
if (bitIndex == 8)
{
bitIndex = 0;
byteIndex++;
}
}
return arr2;
}