| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129 |
- //
- // System.Net.IPEndPoint.cs
- //
- // Author:
- // Miguel de Icaza ([email protected])
- //
- // (C) Ximian, Inc. http://www.ximian.com
- //
- using System.Net.Sockets;
- namespace System.Net {
- [Serializable]
- public class IPEndPoint : EndPoint {
- private IPAddress address;
- private int port;
- public const int MaxPort = 65535;
- public const int MinPort = 0;
-
- public IPEndPoint (IPAddress address, int port)
- {
- if (address == null)
- throw new ArgumentNullException ("Value cannot be null");
- Address = address;
- Port = port;
- }
-
- public IPEndPoint (long iaddr, int port) : this (new IPAddress (iaddr), port)
- {
- }
- public IPAddress Address {
- get {
- return (address);
- }
- set {
- address=value;
- }
- }
- public override AddressFamily AddressFamily {
- get {
- return AddressFamily.InterNetwork;
- }
- }
- public int Port {
- get {
- return port;
- }
- set {
- // LAMESPEC: no mention of sanity checking
- // PS: MS controls the range when setting the value
- if (value < MinPort || value > MaxPort)
- throw new ArgumentOutOfRangeException ("Invalid port");
-
- port = value;
- }
- }
- // bytes 2 and 3 store the port, the rest
- // stores the address
- public override EndPoint Create(SocketAddress sockaddr) {
- int size=sockaddr.Size;
-
- // LAMESPEC: no mention of what to do if
- // sockaddr is bogus
- if(size<8) {
- // absolute minimum amount needed for
- // an address family, buffer size,
- // port and address
- return(null);
- }
- AddressFamily family=(AddressFamily)sockaddr[0];
- if(family!=AddressFamily.InterNetwork) {
- return(null);
- }
-
- int 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];
- 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 & 0xff);
- sockaddr [5] = (byte) ((address.Address >> 8) & 0xff);
- sockaddr [6] = (byte) ((address.Address >> 16) & 0xff);
- sockaddr [7] = (byte) ((address.Address >> 24) & 0xff);
-
- return(sockaddr);
- }
- public override string ToString() {
- return(address.ToString() + ":" + port);
- }
- public override bool Equals (Object obj)
- {
- IPEndPoint p = obj as IPEndPoint;
- return p != null &&
- p.port == port &&
- p.address.Equals (address);
- }
- public override int GetHashCode ()
- {
- return address.GetHashCode () + port;
- }
- }
- }
|