IPEndPoint.cs 2.9 KB

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