using System; namespace Cosmos.System.Network.IPv4 { /// /// Defines a IPv4 Address /// Should actually be using System.Net.IPAddress, but gives problems /// public class Address : IComparable { /// /// Predefined 0.0.0.0 address /// public static Address Zero = new Address(0, 0, 0, 0); public static Address Broadcast = new Address(255, 255, 255, 255); internal byte[] address = new byte[4]; public Address(byte aFirst, byte aSecond, byte aThird, byte aFourth) { address[0] = aFirst; address[1] = aSecond; address[2] = aThird; address[3] = aFourth; } public Address(byte[] buffer, int offset) { if (buffer == null || buffer.Length < (offset + 4)) throw new ArgumentException("buffer does not contain enough data starting at offset", "buffer"); address[0] = buffer[offset]; address[1] = buffer[offset + 1]; address[2] = buffer[offset + 2]; address[3] = buffer[offset + 3]; } /// /// Parse a IP Address in string representation /// /// IP Address as string /// public static Address Parse(string adr) { string[] fragments = adr.Split('.'); if (fragments.Length == 4) { byte first = byte.Parse(fragments[0]); byte second = byte.Parse(fragments[1]); byte third = byte.Parse(fragments[2]); byte fourth = byte.Parse(fragments[3]); return new Address(first, second, third, fourth); } else { return null; } } public bool IsLoopbackAddress() { if (address[0] == 127) return true; else return false; } public bool IsBroadcastAddress() => address[0] == 0xFF && address[1] == 0xFF && address[2] == 0xFF && address[3] == 0xFF; public bool IsAPIPA() { if ((address[0] == 169) && (address[1] == 254)) { return true; } return false; } /// /// Converts IP Address to String /// /// String with IP Address in dotted notation public override string ToString() { return address[0] + "." + address[1] + "." + address[2] + "." + address[3]; } public byte[] ToByteArray() { return address; } private UInt32 to32BitNumber() { return (UInt32)((address[0] << 24) | (address[1] << 16) | (address[2] << 8) | (address[3] << 0)); } private UInt32 hash; /// /// Hash value for this IP. Used to uniquely identify each IP /// public UInt32 Hash { get { if (hash == 0) { hash = to32BitNumber(); } return hash; } } #region IComparable Members /// /// Compare 2 IP Address objects for equality /// /// /// 0 if equal, or non-zero otherwise public int CompareTo(object obj) { if (obj is Address) { Address other = (Address)obj; if (other.hash != this.hash) { return -1; } return 0; } else throw new ArgumentException("obj is not a IPv4Address", "obj"); } #endregion } }