Beispiel #1
0
        protected virtual void Dispose(bool disposing)
        {
            if (!Disposed)
            {
                Server.RemoveClient(this);
                if (disposing)
                {
                    // dispose managed state (managed objects).
                    foreach (var http in RemoteClients)
                    {
                        http.Value.Dispose();
                    }
                    _taskScheduler.Dispose();
                    RemoteClients.Clear();
                    _timer.Dispose();
                    Authenticator.Dispose();
                    Cryptor.Dispose();
                }

                // free unmanaged resources (unmanaged objects) and override a finalizer below.
                // set large fields to null.

                _taskScheduler = null;
                _taskFactory   = null;
                _timer         = null;
                RemoteClients  = null;
                Disposed       = true;
            }
        }
Beispiel #2
0
 public SharkClient(SharkServer server)
 {
     Id              = RandomIdGenerator.NewId();
     Server          = server;
     RemoteClients   = new ConcurrentDictionary <int, ISocketClient>();
     CanRead         = true;
     _taskScheduler  = new SingleThreadingScheduler();
     _taskFactory    = new TaskFactory(_taskScheduler);
     DisconnectQueue = new ConcurrentQueue <int>();
     _timer          = new Timer(OnTimeOut, null, 2000, 2000);
 }
Beispiel #3
0
        protected virtual void Dispose(bool disposing)
        {
            lock (_syncRoot)
            {
                if (!Disposed)
                {
                    if (disposing)
                    {
                        // dispose managed state (managed objects).
                        try
                        {
                            _tcp.Client.Shutdown(SocketShutdown.Both);
                            _tcp.Client.Disconnect(false);
                        }
                        catch (Exception)
                        {
                            Logger.LogWarning("Socket errored before shutdown and disconnect");
                        }
                        _taskScheduler.Dispose();
                        _stream.Dispose();
                        _tcp.Dispose();
                        _disconnectTimer.Dispose();
                        _authenticator.Dispose();
                        _keyGenerator.Dispose();
                        Cryptor.Dispose();
                        RemoteClients.Clear();
                    }

                    // free unmanaged resources (unmanaged objects) and override a finalizer below.
                    // set large fields to null.
                    _taskScheduler   = null;
                    _taskFactory     = null;
                    _tcp             = null;
                    _stream          = null;
                    _disconnectTimer = null;
                    _authenticator   = null;
                    _keyGenerator    = null;
                    Disposed         = true;
                }
            }
        }
Beispiel #4
0
        public SharkClient(IServiceProvider serviceProvider,
                           ILogger <SharkClient> logger
                           )
        {
            var tcp       = new TcpClient(AddressFamily.InterNetworkV6);
            var configure = serviceProvider.GetService <IConfiguration>();

            tcp.Client.DualMode = true;

            _tcp               = tcp;
            Id                 = RandomIdGenerator.NewId();
            ServiceProvider    = serviceProvider;
            RemoteClients      = new ConcurrentDictionary <int, ISocketClient>();
            DisconnectQueue    = new ConcurrentQueue <int>();
            _stopInternal      = new TaskCompletionSource <int>();
            _syncRoot          = new object();
            _disconnectTimer   = new Timer(OnDisconnectTimeout, null, 2000, 2000);
            _closeTimer        = new Timer(OnCloseTimeout, null, Timeout.Infinite, Timeout.Infinite);
            _taskScheduler     = new SingleThreadingScheduler();
            _taskFactory       = new TaskFactory(_taskScheduler);
            _closeTimerStarted = 0;
            Logger             = logger;
            Initialized        = false;

            Cryptor        = serviceProvider.GetByConfiguration <ICryptor>();
            _keyGenerator  = serviceProvider.GetByConfiguration <IKeyGenerator>();
            _authenticator = serviceProvider.GetByConfiguration <IAuthenticator>();

            if (!int.TryParse(configure?["client:maxWaitTime"], out var seconds) || seconds <= 0)
            {
#if DEBUG
                seconds = 10;
#else
                seconds = 60;
#endif
            }
            _maxWaitTime = TimeSpan.FromSeconds(seconds);
        }