예제 #1
0
        private void ProcessKeepalive(byte[] data)
        {
            try
            {
                var keepalive = BinaryPrimitives.ReadUInt64LittleEndian(data);

                if (!KeepaliveTimestamps.TryRemove(keepalive, out var timestamp))
                {
                    return;
                }

                var tdelta = (int)(((Stopwatch.GetTimestamp() - timestamp) / (double)Stopwatch.Frequency) * 1000);
                Volatile.Write(ref _wsPing, tdelta);
                Discord.DebugLogger.LogMessage(LogLevel.Debug, "VNext UDP", $"Received UDP keepalive {keepalive}, ping {tdelta}ms", DateTime.Now);
            }
            catch (Exception ex)
            {
                Discord.DebugLogger.LogMessage(LogLevel.Error, "VNext UDP", "Exception occured when handling keepalive", DateTime.Now, ex);
            }
        }
예제 #2
0
        private async Task KeepaliveAsync()
        {
            await Task.Yield();

            var token  = KeepaliveToken;
            var client = UdpClient;

            while (!token.IsCancellationRequested)
            {
                var timestamp = Stopwatch.GetTimestamp();
                var keepalive = Volatile.Read(ref _lastKeepalive);
                Volatile.Write(ref _lastKeepalive, keepalive + 1);
                KeepaliveTimestamps.TryAdd(keepalive, timestamp);

                var packet = new byte[8];
                BinaryPrimitives.WriteUInt64LittleEndian(packet, keepalive);

                await client.SendAsync(packet, packet.Length).ConfigureAwait(false);

                await Task.Delay(5000, token);
            }
        }