2002-04-15 Gonzalo Paniagua Javier <gonzalo@ximian.com>
[mono.git] / mcs / class / System / System.Net / IPEndPoint.cs
1 //
2 // System.Net.IPEndPoint.cs
3 //
4 // Author:
5 //   Miguel de Icaza (miguel@ximian.com)
6 //
7 // (C) Ximian, Inc.  http://www.ximian.com
8 //
9
10 using System.Net.Sockets;
11
12 namespace System.Net {
13         [Serializable]
14         public class IPEndPoint : EndPoint {
15
16                 public const int MaxPort = 65535;
17                 public const int MinPort = 0;
18                 
19                 public IPEndPoint (IPAddress address, int port)
20                 {
21                         if (address == null)
22                                 throw new ArgumentNullException ("Value cannot be null");
23
24                         Address = address;
25                         Port = port;
26                 }
27                 
28                 public IPEndPoint (long iaddr, int port) : this (new IPAddress (iaddr), port)
29                 {
30                 }
31
32                 private IPAddress address;
33                 public IPAddress Address {
34                         get {
35                                 return(address);
36                         }
37                         set {
38                                 address=value;
39                         }
40                 }
41
42                 public override AddressFamily AddressFamily {
43                         get {
44                                 return AddressFamily.InterNetwork;
45                         }
46                 }
47
48                 private int port;
49                 public int Port {
50                         get {
51                                 return port;
52                         }
53                         set {
54                                 // LAMESPEC: no mention of sanity checking
55                                 // PS: MS controls the range when setting the value
56                                 if (value < MinPort || value > MaxPort)
57                                         throw new ArgumentOutOfRangeException ("Invalid port");
58                         
59                                 port = value;
60                         }
61                 }
62
63                 // bytes 2 and 3 store the port, the rest
64                 // stores the address
65                 public override EndPoint Create(SocketAddress sockaddr) {
66                         int size=sockaddr.Size;
67                         
68                         // LAMESPEC: no mention of what to do if
69                         // sockaddr is bogus
70                         if(size<8) {
71                                 // absolute minimum amount needed for
72                                 // an address family, buffer size,
73                                 // port and address
74                                 return(null);
75                         }
76                         AddressFamily family=(AddressFamily)sockaddr[0];
77                         if(family!=AddressFamily.InterNetwork) {
78                                 return(null);
79                         }
80                         
81                         int port=(((int)sockaddr[2])<<8) + (int)sockaddr[3];
82                         long address=(((long)sockaddr[4])<<24) +
83                                 (((long)sockaddr[5])<<16) +
84                                 (((long)sockaddr[6])<<8) +
85                                 (long)sockaddr[7];
86
87                         IPEndPoint ipe = new IPEndPoint(address, port);
88                         
89                         return(ipe);
90                 }
91
92                 public override SocketAddress Serialize() {
93                         // .net produces a 16 byte buffer, even though
94                         // only 8 bytes are used. I guess its just a
95                         // holdover from struct sockaddr padding.
96                         SocketAddress sockaddr = new SocketAddress(AddressFamily.InterNetwork, 16);
97
98                         // bytes 2 and 3 store the port, the rest
99                         // stores the address
100                         sockaddr[2]=(byte)((port>>8) & 0xff);
101                         sockaddr[3]=(byte)(port & 0xff);
102
103                         sockaddr[4]=(byte)((address.Address >> 24) & 0xff);
104                         sockaddr[5]=(byte)((address.Address >> 16) & 0xff);
105                         sockaddr[6]=(byte)((address.Address >> 8) & 0xff);
106                         sockaddr[7]=(byte)(address.Address & 0xff);
107                         
108                         return(sockaddr);
109                 }
110
111                 public override string ToString() {
112                         return(address.ToString() + ":" + port);
113                 }
114
115                 public override bool Equals (Object obj)
116                 {
117                         if (obj is System.Net.IPEndPoint) {
118                                 return ( ((IPEndPoint) obj).port == port &&
119                                          ((IPEndPoint) obj).address == address);
120                         }
121
122                         return false;
123                 }
124
125                 public override int GetHashCode ()
126                 {
127                         return address.GetHashCode () + port;
128                 }
129         }
130 }