using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Text; using System.Threading.Tasks; namespace PepperDash.Essentials.Core { /// /// Extensions for IPAddress to provide additional functionality such as getting broadcast address, network address, and checking if two addresses are in the same subnet. /// public static class IPAddressExtensions { /// /// Get the broadcast address for a given IP address and subnet mask. /// /// Address to check /// Subnet mask in a.b.c.d format /// Broadcast address /// /// If the input IP address is 192.168.1.100 and the subnet mask is 255.255.255.0, the broadcast address will be 192.168.1.255 /// /// 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); } /// /// Get the network address for a given IP address and subnet mask. /// /// Address to check /// Subnet mask in a.b.c.d /// Network Address /// /// /// If the input IP address is 192.168.1.100 and the subnet mask is 255.255.255.0, the network address will be 192.168.1.0 /// /// 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); } /// /// Determine if two IP addresses are in the same subnet. /// /// Address to check /// Second address to check /// Subnet mask to use to compare the 2 IP Address /// True if addresses are in the same subnet /// /// If the input IP addresses are 192.168.1.100 and 192.168.1.200, and the subnet mask is 255.255.255.0, this will return true. /// If the input IP addresses are 10.1.1.100 and 192.168.1.100, and the subnet mask is 255.255.255.0, this will return false. /// 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); } } }