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); } } }
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(); } } }