singrdk/base/Libraries/System.Net/IPAddress.cs

125 lines
3.5 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// Microsoft Research Singularity
//
// Copyright (c) Microsoft Corporation. All rights reserved.
//
// File: IPAddress.cs
//
// Note:
// This file is a wrapper around Singularity's internal networking types
//
using System;
using System.Net.IP; // Singularity networking type space
using System.Net.Sockets;
using Microsoft.Singularity.Io;
using Microsoft.Contracts;
//
// Currently this wrapper is IPv4-specific!
//
public class IPAddress {
public static readonly IPAddress Any = new IPAddress(IPv4.Any);
public static readonly IPAddress Loopback = new IPAddress(IPv4.Loopback);
public static readonly IPAddress Broadcast = new IPAddress(IPv4.Broadcast);
public static readonly IPAddress None = Broadcast;
internal IPv4 m_addr; // Our wrapped address
// newAddress is provided in network order.
[NotDelayed]
public IPAddress(long newAddress) {
SetFromLong(newAddress);
}
// address is MST byte first (index 0)
public IPAddress(byte[]! address) {
if (address.Length != 4) {
throw new NotSupportedException("Byte array length must be 4");
}
uint addr = ((uint)address[0]) << 24;
addr += ((uint)address[1]) << 16;
addr += ((uint)address[2]) << 8;
addr += ((uint)address[3]);
m_addr = new IPv4(addr);
}
public IPAddress(IPv4 addr)
{ m_addr = new IPv4(addr); }
public static IPAddress! Parse(string ipString)
{ return new IPAddress(IPv4.Parse(ipString)); }
private void SetFromLong(long value)
{
if (value < 0 || value > 0x00000000FFFFFFFF) {
throw new ArgumentOutOfRangeException("value");
}
m_addr = new IPv4((uint)NetworkToHostOrder(value));
}
// TODO
[ Obsolete("IPAddress.Address is address family dependant, use " +
"Equals method for comparison.") ]
public long Address {
get {
return (uint)m_addr;
}
set {
SetFromLong(value);
}
}
public AddressFamily AddressFamily {
get {
return AddressFamily.InterNetwork;
}
}
public byte[] GetAddressBytes()
{ return m_addr.GetAddressBytes(); }
public override string! ToString()
{ return m_addr.ToString(); }
public static long HostToNetworkOrder(long host) {
return ByteOrder.HostToBigEndian(host);
}
public static int HostToNetworkOrder(int host) {
return ByteOrder.HostToBigEndian(host);
}
public static short HostToNetworkOrder(short host) {
return ByteOrder.HostToBigEndian(host);
}
public static long NetworkToHostOrder(long network) {
return ByteOrder.HostToBigEndian(network);
}
public static int NetworkToHostOrder(int network) {
return ByteOrder.HostToBigEndian(network);
}
public static short NetworkToHostOrder(short network) {
return ByteOrder.HostToBigEndian(network);
}
public static IPAddress operator&(IPAddress! lhs, IPAddress! rhs)
{ return new IPAddress(lhs.m_addr & rhs.m_addr); }
public static bool IsLoopback(IPAddress! address)
{ return address.m_addr.IsLoopback(); }
public override bool Equals(object comparand)
{ return m_addr.Equals(comparand); }
public override int GetHashCode()
{ return m_addr.GetHashCode(); }
} // class IPAddress