X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mcs%2Fclass%2FSystem%2FSystem.Net%2FIPEndPoint.cs;h=fb0134f31b98805da703a7bc961e89d1ddcb8298;hb=b9ce91a104a09cd872c5105edd8d321565c9f3ed;hp=65366527ea706e97d57b16295f23eb4b7f8f5978;hpb=f3cd574ac3e12fca06d1142b1296bf41dac7780d;p=mono.git diff --git a/mcs/class/System/System.Net/IPEndPoint.cs b/mcs/class/System/System.Net/IPEndPoint.cs index 65366527ea7..fb0134f31b9 100755 --- a/mcs/class/System/System.Net/IPEndPoint.cs +++ b/mcs/class/System/System.Net/IPEndPoint.cs @@ -13,6 +13,9 @@ namespace System.Net { [Serializable] public class IPEndPoint : EndPoint { + private IPAddress address; + private int port; + public const int MaxPort = 65535; public const int MinPort = 0; @@ -29,10 +32,9 @@ namespace System.Net { { } - private IPAddress address; public IPAddress Address { get { - return(address); + return (address); } set { address=value; @@ -41,11 +43,10 @@ namespace System.Net { public override AddressFamily AddressFamily { get { - return AddressFamily.InterNetwork; + return address.AddressFamily; } } - private int port; public int Port { get { return port; @@ -73,38 +74,91 @@ namespace System.Net { // port and address return(null); } + AddressFamily family=(AddressFamily)sockaddr[0]; - if(family!=AddressFamily.InterNetwork) { - return(null); + int port; + + IPEndPoint ipe = null; + switch(family) + { + case AddressFamily.InterNetwork: + port = (((int)sockaddr[2])<<8) + (int)sockaddr[3]; + long address=(((long)sockaddr[7])<<24) + + (((long)sockaddr[6])<<16) + + (((long)sockaddr[5])<<8) + + (long)sockaddr[4]; + + ipe = new IPEndPoint(address, port); + break; +#if NET_1_1 + case AddressFamily.InterNetworkV6: + port = (((int)sockaddr[2])<<8) + (int)sockaddr[3]; + + /// maybe flowid ? + int unknown = (int)sockaddr[4] + + (((int)sockaddr[5])<<8) + + (((int)sockaddr[6])<<16) + + (((int)sockaddr[7])<<24); + + int scopeId = (int)sockaddr[24] + + (((int)sockaddr[25])<<8) + + (((int)sockaddr[26])<<16) + + (((int)sockaddr[27])<<24); + + ushort[] addressData = new ushort[8]; + for(int i=0; i<8; i++) + addressData[i] = (ushort)((sockaddr[8+i*2] << 8) + sockaddr[8+i*2+1]); + + ipe = new IPEndPoint (new IPAddress(addressData, scopeId), port); + break; +#endif + default: + return null; } - - int port=(((int)sockaddr[2])<<8) + (int)sockaddr[3]; - long address=(((long)sockaddr[4])<<24) + - (((long)sockaddr[5])<<16) + - (((long)sockaddr[6])<<8) + - (long)sockaddr[7]; - IPEndPoint ipe = new IPEndPoint(address, port); - return(ipe); } public override SocketAddress Serialize() { - // .net produces a 16 byte buffer, even though - // only 8 bytes are used. I guess its just a - // holdover from struct sockaddr padding. - SocketAddress sockaddr = new SocketAddress(AddressFamily.InterNetwork, 16); - - // bytes 2 and 3 store the port, the rest - // stores the address - sockaddr[2]=(byte)((port>>8) & 0xff); - sockaddr[3]=(byte)(port & 0xff); - - sockaddr[4]=(byte)((address.Address >> 24) & 0xff); - sockaddr[5]=(byte)((address.Address >> 16) & 0xff); - sockaddr[6]=(byte)((address.Address >> 8) & 0xff); - sockaddr[7]=(byte)(address.Address & 0xff); - + SocketAddress sockaddr = null; + + switch (address.AddressFamily) + { + case AddressFamily.InterNetwork: + // .net produces a 16 byte buffer, even though + // only 8 bytes are used. I guess its just a + // holdover from struct sockaddr padding. + sockaddr = new SocketAddress(AddressFamily.InterNetwork, 16); + + // bytes 2 and 3 store the port, the rest + // stores the address + sockaddr [2] = (byte) ((port>>8) & 0xff); + sockaddr [3] = (byte) (port & 0xff); + + sockaddr [4] = (byte) (address.Address & 0xff); + sockaddr [5] = (byte) ((address.Address >> 8) & 0xff); + sockaddr [6] = (byte) ((address.Address >> 16) & 0xff); + sockaddr [7] = (byte) ((address.Address >> 24) & 0xff); + break; +#if NET_1_1 + case AddressFamily.InterNetworkV6: + sockaddr = new SocketAddress(AddressFamily.InterNetworkV6, 28); + + sockaddr [2] = (byte) ((port>>8) & 0xff); + sockaddr [3] = (byte) (port & 0xff); + + byte[] addressBytes = address.GetAddressBytes(); + for(int i=0; i<16; i++) + sockaddr[8+i] = addressBytes[i]; + + sockaddr [24] = (byte) (address.ScopeId & 0xff); + sockaddr [25] = (byte) ((address.ScopeId >> 8) & 0xff); + sockaddr [26] = (byte) ((address.ScopeId >> 16) & 0xff); + sockaddr [27] = (byte) ((address.ScopeId >> 24) & 0xff); + break; +#endif + } + return(sockaddr); } @@ -114,12 +168,10 @@ namespace System.Net { public override bool Equals (Object obj) { - if (obj is System.Net.IPEndPoint) { - return ( ((IPEndPoint) obj).port == port && - ((IPEndPoint) obj).address == address); - } - - return false; + IPEndPoint p = obj as IPEndPoint; + return p != null && + p.port == port && + p.address.Equals (address); } public override int GetHashCode ()