2 // System.Net.IPEndPoint.cs
5 // Miguel de Icaza (miguel@ximian.com)
7 // (C) Ximian, Inc. http://www.ximian.com
10 using System.Net.Sockets;
12 namespace System.Net {
14 public class IPEndPoint : EndPoint {
16 private IPAddress address;
19 public const int MaxPort = 65535;
20 public const int MinPort = 0;
22 public IPEndPoint (IPAddress address, int port)
25 throw new ArgumentNullException ("Value cannot be null");
31 public IPEndPoint (long iaddr, int port) : this (new IPAddress (iaddr), port)
35 public IPAddress Address {
44 public override AddressFamily AddressFamily {
46 return address.AddressFamily;
55 // LAMESPEC: no mention of sanity checking
56 // PS: MS controls the range when setting the value
57 if (value < MinPort || value > MaxPort)
58 throw new ArgumentOutOfRangeException ("Invalid port");
64 // bytes 2 and 3 store the port, the rest
66 public override EndPoint Create(SocketAddress sockaddr) {
67 int size=sockaddr.Size;
69 // LAMESPEC: no mention of what to do if
72 // absolute minimum amount needed for
73 // an address family, buffer size,
78 AddressFamily family=(AddressFamily)sockaddr[0];
81 IPEndPoint ipe = null;
84 case AddressFamily.InterNetwork:
\r
85 port = (((int)sockaddr[2])<<8) + (int)sockaddr[3];
86 long address=(((long)sockaddr[7])<<24) +
87 (((long)sockaddr[6])<<16) +
88 (((long)sockaddr[5])<<8) +
91 ipe = new IPEndPoint(address, port);
\r
94 case AddressFamily.InterNetworkV6:
\r
95 port = (((int)sockaddr[2])<<8) + (int)sockaddr[3];
98 int unknown = (int)sockaddr[4] +
99 (((int)sockaddr[5])<<8) +
100 (((int)sockaddr[6])<<16) +
101 (((int)sockaddr[7])<<24);
103 int scopeId = (int)sockaddr[24] +
104 (((int)sockaddr[25])<<8) +
105 (((int)sockaddr[26])<<16) +
106 (((int)sockaddr[27])<<24);
108 ushort[] addressData = new ushort[8];
109 for(int i=0; i<8; i++)
110 addressData[i] = (ushort)((sockaddr[8+i*2] << 8) + sockaddr[8+i*2+1]);
112 ipe = new IPEndPoint (new IPAddress(addressData, scopeId), port);
\r
122 public override SocketAddress Serialize() {
123 SocketAddress sockaddr = null;
125 switch (address.AddressFamily)
127 case AddressFamily.InterNetwork:
\r
128 // .net produces a 16 byte buffer, even though
129 // only 8 bytes are used. I guess its just a
130 // holdover from struct sockaddr padding.
131 sockaddr = new SocketAddress(AddressFamily.InterNetwork, 16);
133 // bytes 2 and 3 store the port, the rest
134 // stores the address
135 sockaddr [2] = (byte) ((port>>8) & 0xff);
136 sockaddr [3] = (byte) (port & 0xff);
138 sockaddr [4] = (byte) (address.Address & 0xff);
139 sockaddr [5] = (byte) ((address.Address >> 8) & 0xff);
140 sockaddr [6] = (byte) ((address.Address >> 16) & 0xff);
141 sockaddr [7] = (byte) ((address.Address >> 24) & 0xff);
\r
144 case AddressFamily.InterNetworkV6:
\r
145 sockaddr = new SocketAddress(AddressFamily.InterNetworkV6, 28);
147 sockaddr [2] = (byte) ((port>>8) & 0xff);
148 sockaddr [3] = (byte) (port & 0xff);
150 byte[] addressBytes = address.GetAddressBytes();
151 for(int i=0; i<16; i++)
152 sockaddr[8+i] = addressBytes[i];
154 sockaddr [24] = (byte) (address.ScopeId & 0xff);
155 sockaddr [25] = (byte) ((address.ScopeId >> 8) & 0xff);
156 sockaddr [26] = (byte) ((address.ScopeId >> 16) & 0xff);
157 sockaddr [27] = (byte) ((address.ScopeId >> 24) & 0xff);
\r
165 public override string ToString() {
166 return(address.ToString() + ":" + port);
169 public override bool Equals (Object obj)
171 IPEndPoint p = obj as IPEndPoint;
174 p.address.Equals (address);
177 public override int GetHashCode ()
179 return address.GetHashCode () + port;