2004-01-27 Nick Drochak <ndrochak@ieee.org>
[mono.git] / mcs / class / System / System.Net / IPEndPoint.cs
index 65366527ea706e97d57b16295f23eb4b7f8f5978..fb0134f31b98805da703a7bc961e89d1ddcb8298 100755 (executable)
@@ -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)
+                       {\r
+                               case AddressFamily.InterNetwork:\r
+                                       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);\r
+                                       break;\r
+#if NET_1_1\r
+                               case AddressFamily.InterNetworkV6:\r
+                                       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);\r
+                                       break;\r
+#endif\r
+                               default:\r
+                                       return null;\r
                        }
-                       
-                       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)
+                       {\r
+                               case AddressFamily.InterNetwork:\r
+                                       // .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);\r
+                                       break;\r
+#if NET_1_1\r
+                               case AddressFamily.InterNetworkV6:\r
+                                       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);\r
+                                       break;\r
+#endif\r
+                       }
+
                        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 ()