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 public const int MaxPort = 65535;
17 public const int MinPort = 0;
19 public IPEndPoint (IPAddress address, int port)
21 if(port<MinPort || port>MaxPort) {
22 throw new ArgumentException("Invalid port");
29 public IPEndPoint (long iaddr, int port)
31 if(port<MinPort || port>MaxPort) {
32 throw new ArgumentException("Invalid port");
35 IPAddress address = new IPAddress (iaddr);
41 private IPAddress address;
42 public IPAddress Address {
51 public override AddressFamily AddressFamily {
53 return AddressFamily.InterNetwork;
63 // LAMESPEC: no mention of sanity checking
68 // bytes 2 and 3 store the port, the rest
70 public override EndPoint Create(SocketAddress sockaddr) {
71 int size=sockaddr.Size;
73 // LAMESPEC: no mention of what to do if
76 // absolute minimum amount needed for
77 // an address family, buffer size,
81 AddressFamily family=(AddressFamily)sockaddr[0];
82 if(family!=AddressFamily.InterNetwork) {
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) +
92 IPEndPoint ipe = new IPEndPoint(address, port);
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);
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);
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);
116 public override string ToString() {
117 return(address.ToString() + ":" + port);
120 public override bool Equals (Object obj)
122 if (obj is System.Net.IPEndPoint) {
123 return ( ((IPEndPoint) obj).port == port &&
124 ((IPEndPoint) obj).address == address);
130 public override int GetHashCode ()
132 return address.GetHashCode () + port;