ClientMetadata.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. namespace WatsonTcp
  2. {
  3. using System;
  4. using System.IO;
  5. using System.Net.Security;
  6. using System.Net.Sockets;
  7. using System.Threading;
  8. using System.Threading.Tasks;
  9. /// <summary>
  10. /// Client metadata.
  11. /// </summary>
  12. public class ClientMetadata : IDisposable
  13. {
  14. #region Public-Members
  15. /// <summary>
  16. /// GUID.
  17. /// </summary>
  18. public Guid Guid { get; set; } = Guid.NewGuid();
  19. /// <summary>
  20. /// IP:port for the connection.
  21. /// </summary>
  22. public string IpPort
  23. {
  24. get
  25. {
  26. return _IpPort;
  27. }
  28. }
  29. /// <summary>
  30. /// Name for the client, managed by the developer (you).
  31. /// </summary>
  32. public string Name { get; set; } = null;
  33. /// <summary>
  34. /// Metadata for the client, managed by the developer (you).
  35. /// </summary>
  36. public object Metadata { get; set; } = null;
  37. #endregion
  38. #region Internal-Members
  39. internal TcpClient TcpClient
  40. {
  41. get
  42. {
  43. return _TcpClient;
  44. }
  45. }
  46. internal NetworkStream NetworkStream
  47. {
  48. get
  49. {
  50. return _NetworkStream;
  51. }
  52. set
  53. {
  54. _NetworkStream = value;
  55. if (_NetworkStream != null)
  56. {
  57. _DataStream = _NetworkStream;
  58. }
  59. }
  60. }
  61. internal SslStream SslStream
  62. {
  63. get
  64. {
  65. return _SslStream;
  66. }
  67. set
  68. {
  69. _SslStream = value;
  70. if (_SslStream != null)
  71. {
  72. _DataStream = _SslStream;
  73. }
  74. }
  75. }
  76. internal Stream DataStream
  77. {
  78. get
  79. {
  80. return _DataStream;
  81. }
  82. }
  83. internal byte[] SendBuffer { get; set; } = new byte[65536];
  84. internal Task DataReceiver { get; set; } = null;
  85. internal SemaphoreSlim WriteLock = new SemaphoreSlim(1, 1);
  86. internal SemaphoreSlim ReadLock = new SemaphoreSlim(1, 1);
  87. internal CancellationTokenSource TokenSource = new CancellationTokenSource();
  88. internal CancellationToken Token;
  89. #endregion
  90. #region Private-Members
  91. private TcpClient _TcpClient = null;
  92. private NetworkStream _NetworkStream = null;
  93. private SslStream _SslStream = null;
  94. private Stream _DataStream = null;
  95. private string _IpPort = null;
  96. #endregion
  97. #region Constructors-and-Factories
  98. internal ClientMetadata(TcpClient tcp)
  99. {
  100. _TcpClient = tcp ?? throw new ArgumentNullException(nameof(tcp));
  101. _IpPort = tcp.Client.RemoteEndPoint.ToString();
  102. NetworkStream = tcp.GetStream();
  103. Token = TokenSource.Token;
  104. }
  105. #endregion
  106. #region Public-Methods
  107. /// <summary>
  108. /// Tear down the object and dispose of resources.
  109. /// </summary>
  110. public void Dispose()
  111. {
  112. if (TokenSource != null)
  113. {
  114. if (!TokenSource.IsCancellationRequested)
  115. {
  116. TokenSource.Cancel();
  117. TokenSource.Dispose();
  118. }
  119. }
  120. _SslStream?.Close();
  121. _NetworkStream?.Close();
  122. if (_TcpClient != null)
  123. {
  124. _TcpClient.Close();
  125. _TcpClient.Dispose();
  126. }
  127. while (DataReceiver?.Status == TaskStatus.Running)
  128. {
  129. Task.Delay(30).Wait();
  130. }
  131. }
  132. /// <summary>
  133. /// Human-readable representation of the object.
  134. /// </summary>
  135. /// <returns></returns>
  136. public override string ToString()
  137. {
  138. string ret = "[";
  139. ret += Guid.ToString() + "|" + IpPort;
  140. if (!String.IsNullOrEmpty(Name)) ret += "|" + Name;
  141. ret += "]";
  142. return ret;
  143. }
  144. #endregion
  145. #region Private-Methods
  146. #endregion
  147. }
  148. }