123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180 |
- namespace WatsonTcp
- {
- using System;
- using System.IO;
- using System.Net.Security;
- using System.Net.Sockets;
- using System.Threading;
- using System.Threading.Tasks;
- /// <summary>
- /// Client metadata.
- /// </summary>
- public class ClientMetadata : IDisposable
- {
- #region Public-Members
- /// <summary>
- /// GUID.
- /// </summary>
- public Guid Guid { get; set; } = Guid.NewGuid();
- /// <summary>
- /// IP:port for the connection.
- /// </summary>
- public string IpPort
- {
- get
- {
- return _IpPort;
- }
- }
- /// <summary>
- /// Name for the client, managed by the developer (you).
- /// </summary>
- public string Name { get; set; } = null;
- /// <summary>
- /// Metadata for the client, managed by the developer (you).
- /// </summary>
- public object Metadata { get; set; } = null;
- #endregion
- #region Internal-Members
- internal TcpClient TcpClient
- {
- get
- {
- return _TcpClient;
- }
- }
- internal NetworkStream NetworkStream
- {
- get
- {
- return _NetworkStream;
- }
- set
- {
- _NetworkStream = value;
- if (_NetworkStream != null)
- {
- _DataStream = _NetworkStream;
- }
- }
- }
- internal SslStream SslStream
- {
- get
- {
- return _SslStream;
- }
- set
- {
- _SslStream = value;
- if (_SslStream != null)
- {
- _DataStream = _SslStream;
- }
- }
- }
- internal Stream DataStream
- {
- get
- {
- return _DataStream;
- }
- }
-
- internal byte[] SendBuffer { get; set; } = new byte[65536];
- internal Task DataReceiver { get; set; } = null;
- internal SemaphoreSlim WriteLock = new SemaphoreSlim(1, 1);
- internal SemaphoreSlim ReadLock = new SemaphoreSlim(1, 1);
- internal CancellationTokenSource TokenSource = new CancellationTokenSource();
- internal CancellationToken Token;
- #endregion
- #region Private-Members
- private TcpClient _TcpClient = null;
- private NetworkStream _NetworkStream = null;
- private SslStream _SslStream = null;
- private Stream _DataStream = null;
- private string _IpPort = null;
- #endregion
- #region Constructors-and-Factories
- internal ClientMetadata(TcpClient tcp)
- {
- _TcpClient = tcp ?? throw new ArgumentNullException(nameof(tcp));
- _IpPort = tcp.Client.RemoteEndPoint.ToString();
- NetworkStream = tcp.GetStream();
- Token = TokenSource.Token;
- }
- #endregion
- #region Public-Methods
- /// <summary>
- /// Tear down the object and dispose of resources.
- /// </summary>
- public void Dispose()
- {
- if (TokenSource != null)
- {
- if (!TokenSource.IsCancellationRequested)
- {
- TokenSource.Cancel();
- TokenSource.Dispose();
- }
- }
- _SslStream?.Close();
- _NetworkStream?.Close();
- if (_TcpClient != null)
- {
- _TcpClient.Close();
- _TcpClient.Dispose();
- }
- while (DataReceiver?.Status == TaskStatus.Running)
- {
- Task.Delay(30).Wait();
- }
- }
- /// <summary>
- /// Human-readable representation of the object.
- /// </summary>
- /// <returns></returns>
- public override string ToString()
- {
- string ret = "[";
- ret += Guid.ToString() + "|" + IpPort;
- if (!String.IsNullOrEmpty(Name)) ret += "|" + Name;
- ret += "]";
- return ret;
- }
- #endregion
- #region Private-Methods
- #endregion
- }
- }
|