2
using System.Collections.Generic;
4
using System.Net.NetworkInformation;
5
using System.Net.Sockets;
6
using ServiceStack.Logging;
8
namespace ServiceStack.Common.Extensions
11
/// Useful IPAddressExtensions from:
12
/// http://blogs.msdn.com/knom/archive/2008/12/31/ip-address-calculations-with-c-subnetmasks-networks.aspx
15
public static class IPAddressExtensions
17
public static IPAddress GetBroadcastAddress(this IPAddress address, IPAddress subnetMask)
19
var ipAdressBytes = address.GetAddressBytes();
20
var subnetMaskBytes = subnetMask.GetAddressBytes();
22
if (ipAdressBytes.Length != subnetMaskBytes.Length)
23
throw new ArgumentException("Lengths of IP address and subnet mask do not match.");
25
var broadcastAddress = new byte[ipAdressBytes.Length];
26
for (var i = 0; i < broadcastAddress.Length; i++)
28
broadcastAddress[i] = (byte)(ipAdressBytes[i] | (subnetMaskBytes[i] ^ 255));
30
return new IPAddress(broadcastAddress);
33
public static IPAddress GetNetworkAddress(this IPAddress address, IPAddress subnetMask)
35
var ipAdressBytes = address.GetAddressBytes();
36
var subnetMaskBytes = subnetMask.GetAddressBytes();
38
return new IPAddress(GetNetworkAddressBytes(ipAdressBytes, subnetMaskBytes));
41
public static byte[] GetNetworkAddressBytes(byte[] ipAdressBytes, byte[] subnetMaskBytes)
43
if (ipAdressBytes.Length != subnetMaskBytes.Length)
44
throw new ArgumentException("Lengths of IP address and subnet mask do not match.");
46
var broadcastAddress = new byte[ipAdressBytes.Length];
47
for (var i = 0; i < broadcastAddress.Length; i++)
49
broadcastAddress[i] = (byte)(ipAdressBytes[i] & (subnetMaskBytes[i]));
51
return broadcastAddress;
54
public static bool IsInSameIpv6Subnet(this IPAddress address2, IPAddress address)
56
if (address2.AddressFamily != AddressFamily.InterNetworkV6 || address.AddressFamily != AddressFamily.InterNetworkV6)
58
throw new ArgumentException("Both IPAddress must be IPV6 addresses");
60
var address1Bytes = address.GetAddressBytes();
61
var address2Bytes = address2.GetAddressBytes();
63
return IsInSameIpv6Subnet(address1Bytes, address2Bytes);
66
public static bool IsInSameIpv6Subnet(this byte[] address1Bytes, byte[] address2Bytes)
68
if (address1Bytes.Length != address2Bytes.Length)
69
throw new ArgumentException("Lengths of IP addresses do not match.");
71
for (var i = 0; i < 8; i++)
73
if (address1Bytes[i] != address2Bytes[i])
82
public static bool IsInSameIpv4Subnet(this IPAddress address2, IPAddress address, IPAddress subnetMask)
84
if (address2.AddressFamily != AddressFamily.InterNetwork || address.AddressFamily != AddressFamily.InterNetwork)
86
throw new ArgumentException("Both IPAddress must be IPV4 addresses");
88
var network1 = address.GetNetworkAddress(subnetMask);
89
var network2 = address2.GetNetworkAddress(subnetMask);
91
return network1.Equals(network2);
94
public static bool IsInSameIpv4Subnet(this byte[] address1Bytes, byte[] address2Bytes, byte[] subnetMaskBytes)
96
if (address1Bytes.Length != address2Bytes.Length)
97
throw new ArgumentException("Lengths of IP addresses do not match.");
99
var network1Bytes = GetNetworkAddressBytes(address1Bytes, subnetMaskBytes);
100
var network2Bytes = GetNetworkAddressBytes(address2Bytes, subnetMaskBytes);
102
return network1Bytes.AreEqual(network2Bytes);
107
/// Gets the ipv4 addresses from all Network Interfaces that have Subnet masks.
109
/// <returns></returns>
110
public static Dictionary<IPAddress, IPAddress> GetAllNetworkInterfaceIpv4Addresses()
112
var map = new Dictionary<IPAddress, IPAddress>();
117
foreach (var ni in NetworkInterface.GetAllNetworkInterfaces())
119
foreach (var uipi in ni.GetIPProperties().UnicastAddresses)
121
if (uipi.Address.AddressFamily != AddressFamily.InterNetwork) continue;
123
if (uipi.IPv4Mask == null) continue; //ignore 127.0.0.1
124
map[uipi.Address] = uipi.IPv4Mask;
129
catch /*(NotImplementedException ex)*/
131
//log.Warn("MONO does not support NetworkInterface.GetAllNetworkInterfaces(). Could not detect local ip subnets.", ex);
137
/// Gets the ipv6 addresses from all Network Interfaces.
139
/// <returns></returns>
140
public static List<IPAddress> GetAllNetworkInterfaceIpv6Addresses()
142
var list = new List<IPAddress>();
147
foreach (var ni in NetworkInterface.GetAllNetworkInterfaces())
149
foreach (var uipi in ni.GetIPProperties().UnicastAddresses)
151
if (uipi.Address.AddressFamily != AddressFamily.InterNetworkV6) continue;
152
list.Add(uipi.Address);
157
catch /*(NotImplementedException ex)*/
159
//log.Warn("MONO does not support NetworkInterface.GetAllNetworkInterfaces(). Could not detect local ip subnets.", ex);
b'\\ No newline at end of file'