forked from ServiceStack/ServiceStack
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathIPAddressExtensions.cs
More file actions
166 lines (141 loc) · 6.31 KB
/
IPAddressExtensions.cs
File metadata and controls
166 lines (141 loc) · 6.31 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
using System;
using System.Collections.Generic;
using System.Net;
using System.Net.NetworkInformation;
using System.Net.Sockets;
using ServiceStack.Logging;
namespace ServiceStack.Common.Extensions
{
/// <summary>
/// Useful IPAddressExtensions from:
/// http://blogs.msdn.com/knom/archive/2008/12/31/ip-address-calculations-with-c-subnetmasks-networks.aspx
///
/// </summary>
public static class IPAddressExtensions
{
public static IPAddress GetBroadcastAddress(this IPAddress address, IPAddress subnetMask)
{
var ipAdressBytes = address.GetAddressBytes();
var subnetMaskBytes = subnetMask.GetAddressBytes();
if (ipAdressBytes.Length != subnetMaskBytes.Length)
throw new ArgumentException("Lengths of IP address and subnet mask do not match.");
var broadcastAddress = new byte[ipAdressBytes.Length];
for (var 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)
{
var ipAdressBytes = address.GetAddressBytes();
var subnetMaskBytes = subnetMask.GetAddressBytes();
return new IPAddress(GetNetworkAddressBytes(ipAdressBytes, subnetMaskBytes));
}
public static byte[] GetNetworkAddressBytes(byte[] ipAdressBytes, byte[] subnetMaskBytes)
{
if (ipAdressBytes.Length != subnetMaskBytes.Length)
throw new ArgumentException("Lengths of IP address and subnet mask do not match.");
var broadcastAddress = new byte[ipAdressBytes.Length];
for (var i = 0; i < broadcastAddress.Length; i++)
{
broadcastAddress[i] = (byte)(ipAdressBytes[i] & (subnetMaskBytes[i]));
}
return broadcastAddress;
}
public static bool IsInSameIpv6Subnet(this IPAddress address2, IPAddress address)
{
if (address2.AddressFamily != AddressFamily.InterNetworkV6 || address.AddressFamily != AddressFamily.InterNetworkV6)
{
throw new ArgumentException("Both IPAddress must be IPV6 addresses");
}
var address1Bytes = address.GetAddressBytes();
var address2Bytes = address2.GetAddressBytes();
return IsInSameIpv6Subnet(address1Bytes, address2Bytes);
}
public static bool IsInSameIpv6Subnet(this byte[] address1Bytes, byte[] address2Bytes)
{
if (address1Bytes.Length != address2Bytes.Length)
throw new ArgumentException("Lengths of IP addresses do not match.");
for (var i = 0; i < 8; i++)
{
if (address1Bytes[i] != address2Bytes[i])
{
return false;
}
}
return true;
}
public static bool IsInSameIpv4Subnet(this IPAddress address2, IPAddress address, IPAddress subnetMask)
{
if (address2.AddressFamily != AddressFamily.InterNetwork || address.AddressFamily != AddressFamily.InterNetwork)
{
throw new ArgumentException("Both IPAddress must be IPV4 addresses");
}
var network1 = address.GetNetworkAddress(subnetMask);
var network2 = address2.GetNetworkAddress(subnetMask);
return network1.Equals(network2);
}
public static bool IsInSameIpv4Subnet(this byte[] address1Bytes, byte[] address2Bytes, byte[] subnetMaskBytes)
{
if (address1Bytes.Length != address2Bytes.Length)
throw new ArgumentException("Lengths of IP addresses do not match.");
var network1Bytes = GetNetworkAddressBytes(address1Bytes, subnetMaskBytes);
var network2Bytes = GetNetworkAddressBytes(address2Bytes, subnetMaskBytes);
return network1Bytes.AreEqual(network2Bytes);
}
/// <summary>
/// Gets the ipv4 addresses from all Network Interfaces that have Subnet masks.
/// </summary>
/// <returns></returns>
public static Dictionary<IPAddress, IPAddress> GetAllNetworkInterfaceIpv4Addresses()
{
var map = new Dictionary<IPAddress, IPAddress>();
try
{
#if !SILVERLIGHT
foreach (var ni in NetworkInterface.GetAllNetworkInterfaces())
{
foreach (var uipi in ni.GetIPProperties().UnicastAddresses)
{
if (uipi.Address.AddressFamily != AddressFamily.InterNetwork) continue;
if (uipi.IPv4Mask == null) continue; //ignore 127.0.0.1
map[uipi.Address] = uipi.IPv4Mask;
}
}
#endif
}
catch /*(NotImplementedException ex)*/
{
//log.Warn("MONO does not support NetworkInterface.GetAllNetworkInterfaces(). Could not detect local ip subnets.", ex);
}
return map;
}
/// <summary>
/// Gets the ipv6 addresses from all Network Interfaces.
/// </summary>
/// <returns></returns>
public static List<IPAddress> GetAllNetworkInterfaceIpv6Addresses()
{
var list = new List<IPAddress>();
try
{
#if !SILVERLIGHT
foreach (var ni in NetworkInterface.GetAllNetworkInterfaces())
{
foreach (var uipi in ni.GetIPProperties().UnicastAddresses)
{
if (uipi.Address.AddressFamily != AddressFamily.InterNetworkV6) continue;
list.Add(uipi.Address);
}
}
#endif
}
catch /*(NotImplementedException ex)*/
{
//log.Warn("MONO does not support NetworkInterface.GetAllNetworkInterfaces(). Could not detect local ip subnets.", ex);
}
return list;
}
}
}