2002-04-15 Patrik Torstensson <patrik.torstensson@labs2.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(port<MinPort || port>MaxPort) {
22                                 throw new ArgumentException("Invalid port");
23                         }
24                         
25                         Address = address;
26                         Port = port;
27                 }
28                 
29                 public IPEndPoint (long iaddr, int port)
30                 {
31                         if(port<MinPort || port>MaxPort) {
32                                 throw new ArgumentException("Invalid port");
33                         }
34                         
35                         IPAddress address = new IPAddress (iaddr);
36                         
37                         Address = address;
38                         Port = port;
39                 }
40
41                 private IPAddress address;
42                 public IPAddress Address {
43                         get {
44                                 return(address);
45                         }
46                         set {
47                                 address=value;
48                         }
49                 }
50
51                 public override AddressFamily AddressFamily {
52                         get {
53                                 return AddressFamily.InterNetwork;
54                         }
55                 }
56
57                 private int port;
58                 public int Port {
59                         get {
60                                 return port;
61                         }
62                         set {
63                                 // LAMESPEC: no mention of sanity checking
64                                 port = value;
65                         }
66                 }
67
68                 // bytes 2 and 3 store the port, the rest
69                 // stores the address
70                 public override EndPoint Create(SocketAddress sockaddr) {
71                         int size=sockaddr.Size;
72                         
73                         // LAMESPEC: no mention of what to do if
74                         // sockaddr is bogus
75                         if(size<8) {
76                                 // absolute minimum amount needed for
77                                 // an address family, buffer size,
78                                 // port and address
79                                 return(null);
80                         }
81                         AddressFamily family=(AddressFamily)sockaddr[0];
82                         if(family!=AddressFamily.InterNetwork) {
83                                 return(null);
84                         }
85                         
86                         int port=(((int)sockaddr[2])<<8) + (int)sockaddr[3];
87                         long address=(((long)sockaddr[4])<<24) +
88                                 (((long)sockaddr[5])<<16) +
89                                 (((long)sockaddr[6])<<8) +
90                                 (long)sockaddr[7];
91
92                         IPEndPoint ipe = new IPEndPoint(address, port);
93                         
94                         return(ipe);
95                 }
96
97                 public override SocketAddress Serialize() {
98                         // .net produces a 16 byte buffer, even though
99                         // only 8 bytes are used. I guess its just a
100                         // holdover from struct sockaddr padding.
101                         SocketAddress sockaddr = new SocketAddress(AddressFamily.InterNetwork, 16);
102
103                         // bytes 2 and 3 store the port, the rest
104                         // stores the address
105                         sockaddr[2]=(byte)((port>>8) & 0xff);
106                         sockaddr[3]=(byte)(port & 0xff);
107
108                         sockaddr[4]=(byte)((address.Address >> 24) & 0xff);
109                         sockaddr[5]=(byte)((address.Address >> 16) & 0xff);
110                         sockaddr[6]=(byte)((address.Address >> 8) & 0xff);
111                         sockaddr[7]=(byte)(address.Address & 0xff);
112                         
113                         return(sockaddr);
114                 }
115
116                 public override string ToString() {
117                         return(address.ToString() + ":" + port);
118                 }
119
120                 public override bool Equals (Object obj)
121                 {
122                         if (obj is System.Net.IPEndPoint) {
123                                 return ( ((IPEndPoint) obj).port == port &&
124                                          ((IPEndPoint) obj).address == address);
125                         }
126
127                         return false;
128                 }
129
130                 public override int GetHashCode ()
131                 {
132                         return address.GetHashCode () + port;
133                 }
134         }
135 }