Note that there are some explanatory texts on larger screens.

plurals
  1. PO
    text
    copied!<p>I have answered my own question by creating a function that checks if an ip address (ipv4 or ipv6) is a non-routable ip address. I have referenced the wiki article from McKay's post to find alot of reserved ip addresses (<a href="http://en.wikipedia.org/wiki/Reserved_IP_addresses">http://en.wikipedia.org/wiki/Reserved_IP_addresses</a>)</p> <p>Solution:</p> <pre><code> /// &lt;summary&gt; /// /// &lt;/summary&gt; /// &lt;param name="ipAddress"&gt;&lt;/param&gt; /// &lt;remarks&gt;A null or empty string passed as the ipAddress will return true. An invalid ipAddress will be returned as true. &lt;/remarks&gt; /// &lt;returns&gt;&lt;/returns&gt; public static bool IsNonRoutableIpAddress(string ipAddress) { //Reference: http://en.wikipedia.org/wiki/Reserved_IP_addresses //if the ip address string is empty or null string, we consider it to be non-routable if (String.IsNullOrEmpty(ipAddress)) { return true; } //if we cannot parse the Ipaddress, then we consider it non-routable IPAddress tempIpAddress = null; if (!IPAddress.TryParse(ipAddress, out tempIpAddress)) { return true; } byte[] ipAddressBytes = tempIpAddress.GetAddressBytes(); //if ipAddress is IPv4 if (tempIpAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetwork) { if (IsIpAddressInRange(ipAddressBytes, "10.0.0.0/8")) //Class A Private network check { return true; } else if (IsIpAddressInRange(ipAddressBytes, "172.16.0.0/12")) //Class B private network check { return true; } else if (IsIpAddressInRange(ipAddressBytes, "192.168.0.0/16")) //Class C private network check { return true; } else if (IsIpAddressInRange(ipAddressBytes, "127.0.0.0/8")) //Loopback { return true; } else if (IsIpAddressInRange(ipAddressBytes, "0.0.0.0/8")) //reserved for broadcast messages { return true; } //its routable if its ipv4 and meets none of the criteria return false; } //if ipAddress is IPv6 else if (tempIpAddress.AddressFamily == System.Net.Sockets.AddressFamily.InterNetworkV6) { //incomplete if (IsIpAddressInRange(ipAddressBytes, "::/128")) //Unspecified address { return true; } else if (IsIpAddressInRange(ipAddressBytes, "::1/128")) //lookback address for localhost { return true; } else if (IsIpAddressInRange(ipAddressBytes, "2001:db8::/32")) //Addresses used in documentation { return true; } return false; } else { //we default to non-routable if its not Ipv4 or Ipv6 return true; } } /// &lt;summary&gt; /// /// &lt;/summary&gt; /// &lt;param name="ipAddressBytes"&gt;&lt;/param&gt; /// &lt;param name="reservedIpAddress"&gt;&lt;/param&gt; /// &lt;returns&gt;&lt;/returns&gt; private static bool IsIpAddressInRange(byte[] ipAddressBytes, string reservedIpAddress) { if (String.IsNullOrEmpty(reservedIpAddress)) { return false; } if (ipAddressBytes == null) { return false; } //Split the reserved ip address into a bitmask and ip address 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; } // Convert the IP address to bytes. byte[] ipBytes = ipAddress.GetAddressBytes(); //parse the bits int bits = 0; if (!int.TryParse(ipAddressSplit[1], out bits)) { bits = 0; } // BitConverter gives bytes in opposite order to GetAddressBytes(). byte[] maskBytes = null; if (ipAddress.AddressFamily == AddressFamily.InterNetwork) { uint mask = ~(uint.MaxValue &gt;&gt; bits); maskBytes = BitConverter.GetBytes(mask).Reverse().ToArray(); } else if (ipAddress.AddressFamily == AddressFamily.InterNetworkV6) { //128 places BitArray bitArray = new BitArray(128, false); //shift &lt;bits&gt; times to the right ShiftRight(bitArray, bits, true); //turn into byte array maskBytes = ConvertToByteArray(bitArray).Reverse().ToArray(); } bool result = true; //Calculate for (int i = 0; i &lt; ipBytes.Length; i++) { result &amp;= (byte)(ipAddressBytes[i] &amp; maskBytes[i]) == ipBytes[i]; } return result; } /// &lt;summary&gt; /// /// &lt;/summary&gt; /// &lt;param name="bitArray"&gt;&lt;/param&gt; /// &lt;param name="shiftN"&gt;&lt;/param&gt; /// &lt;param name="fillValue"&gt;&lt;/param&gt; private static void ShiftRight(BitArray bitArray, int shiftN, bool fillValue) { for (int i = shiftN; i &lt; bitArray.Count; i++) { bitArray[i - shiftN] = bitArray[i]; } //fill the shifted bits as false for (int index = bitArray.Count - shiftN; index &lt; bitArray.Count; index++) { bitArray[index] = fillValue; } } /// &lt;summary&gt; /// /// &lt;/summary&gt; /// &lt;param name="bitArray"&gt;&lt;/param&gt; /// &lt;returns&gt;&lt;/returns&gt; private static byte[] ConvertToByteArray(BitArray bitArray) { // pack (in this case, using the first bool as the lsb - if you want // the first bool as the msb, reverse things ;-p) int bytes = (bitArray.Length + 7) / 8; byte[] arr2 = new byte[bytes]; int bitIndex = 0; int byteIndex = 0; for (int i = 0; i &lt; bitArray.Length; i++) { if (bitArray[i]) { arr2[byteIndex] |= (byte)(1 &lt;&lt; bitIndex); } bitIndex++; if (bitIndex == 8) { bitIndex = 0; byteIndex++; } } return arr2; } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload