internal override async Task StartPing()
        {
            _lastPong     = DateTime.Now.Add(_pingTimeout);
            _pingInterval = TimeSpan.FromMilliseconds(Math.Max(500, _pingTimeout.TotalMilliseconds / 2));

            while (_connection.IsConnected)
            {
                await Task.Delay(_pingInterval).ConfigureAwait(false);

                try
                {
                    var now = DateTime.Now;

                    if (_lastPong.Add(_pingTimeout) < now)
                    {
                        _connection.Close(WebSocketCloseReasons.GoingAway);
                    }
                    else
                    {
                        ((UInt64)now.Ticks).ToBytes(_pingBuffer.Array, _pingBuffer.Offset);
                        _connection.WriteInternal(_pingBuffer, 8, true, false, WebSocketFrameOption.Ping, WebSocketExtensionFlags.None);
                    }
                }
                catch (Exception ex)
                {
                    DebugLog.Fail("LatencyControlPing.StartPing", ex);
                    _connection.Close(WebSocketCloseReasons.ProtocolError);
                }
            }
        }
        internal override async Task StartPing()
        {
            _lastActivity = DateTime.Now.Add(_pingTimeout);
            _pingInterval = TimeSpan.FromMilliseconds(Math.Max(500, _pingTimeout.TotalMilliseconds / 2));

            while (_connection.IsConnected)
            {
                await Task.Delay(_pingInterval).ConfigureAwait(false);

                try
                {
                    var now = DateTime.Now;

                    if (_lastActivity.Add(_pingTimeout) < now)
                    {
                        _connection.Close(WebSocketCloseReasons.GoingAway);
                    }
                    else if (_lastActivity.Add(_pingInterval) < now)
                    {
                        _connection.WriteInternal(_pingBuffer, 0, true, false, WebSocketFrameOption.Ping, WebSocketExtensionFlags.None);
                    }
                }
                catch (Exception ex)
                {
                    DebugLog.Fail("BandwidthSavingPing.StartPing", ex);
                    _connection.Close(WebSocketCloseReasons.ProtocolError);
                }
            }
        }
Beispiel #3
0
        internal void Close(WebSocketCloseReasons reason)
        {
            try
            {
                if (Interlocked.CompareExchange(ref _isClosed, 1, 0) == 1)
                {
                    return;
                }

                ((UInt16)reason).ToBytesBackwards(_closeBuffer.Array, _closeBuffer.Offset);
                WriteInternal(_closeBuffer, 2, true, false, WebSocketFrameOption.ConnectionClose, WebSocketExtensionFlags.None);
                _clientStream.Close();
            }
            catch (Exception ex)
            {
                DebugLog.Fail("WebSocketConnectionRfc6455.Close", ex);
            }
        }
        private async Task WorkAsync()
        {
            while (!_cancel.IsCancellationRequested)
            {
                try
                {
                    await _semaphore.WaitAsync(_cancel.Token).ConfigureAwait(false);

                    var socket = await _sockets.ReceiveAsync(_cancel.Token).ConfigureAwait(false);

                    Task.Run(() => NegotiateWebSocket(socket));
                }
                catch (TaskCanceledException)
                {
                }
                catch (Exception ex)
                {
                    DebugLog.Fail("HttpNegotiationQueue.WorkAsync", ex);
                    _cancel.Cancel();
                }
            }
        }