123 lines
3.5 KiB
C#
123 lines
3.5 KiB
C#
|
////////////////////////////////////////////////////////////////////////////////
|
||
|
//
|
||
|
// Microsoft Research Singularity
|
||
|
//
|
||
|
// Copyright (c) Microsoft Corporation. All rights reserved.
|
||
|
//
|
||
|
// 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
|
||
|
|