IPEndPoint.cs 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  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. private IPAddress address;
  14. private int port;
  15. public const int MaxPort = 65535;
  16. public const int MinPort = 0;
  17. public IPEndPoint (IPAddress address, int port)
  18. {
  19. if (address == null)
  20. throw new ArgumentNullException ("Value cannot be null");
  21. Address = address;
  22. Port = port;
  23. }
  24. public IPEndPoint (long iaddr, int port) : this (new IPAddress (iaddr), port)
  25. {
  26. }
  27. public IPAddress Address {
  28. get {
  29. return (address);
  30. }
  31. set {
  32. address=value;
  33. }
  34. }
  35. public override AddressFamily AddressFamily {
  36. get {
  37. return AddressFamily.InterNetwork;
  38. }
  39. }
  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[7])<<24) +
  70. (((long)sockaddr[6])<<16) +
  71. (((long)sockaddr[5])<<8) +
  72. (long)sockaddr[4];
  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 & 0xff);
  86. sockaddr [5] = (byte) ((address.Address >> 8) & 0xff);
  87. sockaddr [6] = (byte) ((address.Address >> 16) & 0xff);
  88. sockaddr [7] = (byte) ((address.Address >> 24) & 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. IPEndPoint p = obj as IPEndPoint;
  97. return p != null &&
  98. p.port == port &&
  99. p.address.Equals (address);
  100. }
  101. public override int GetHashCode ()
  102. {
  103. return address.GetHashCode () + port;
  104. }
  105. }
  106. }