Exemplo n.º 1
0
            protected override void Execute()
            {
                var peer              = _peer;
                var networkStream     = peer.NetworkStream;
                var networkType       = peer.NetworkType;
                var sharedSecretBytes = peer.SharedSecretBytes;
                var packetsToSend     = peer._packetsToSend;
                var cancellationToken = _cancellationToken;

                while (!cancellationToken.IsCancellationRequested)
                {
                    try
                    {
                        using var pingTimeout = CancellationTokenSource.CreateLinkedTokenSource(cancellationToken);
                        pingTimeout.CancelAfter(Thread.VolatileRead(ref peer.KeepAliveDuration));

                        var packetToSend = packetsToSend.Take(pingTimeout.Token);
                        packetToSend.WriteDelimitedTo(_peer.NetworkStream);
                    }
                    catch (OperationCanceledException ex)
                    {
                        if (ex.CancellationToken == cancellationToken)
                        {
                            return;
                        }

                        // Timeout caused by ping duration.
                        var packet = PacketUtility.SerializePacket(new PingPacket(), networkType, sharedSecretBytes);
                        packet.WriteDelimitedTo(networkStream);
                    }
                    catch (IOException)
                    {
                        // Either the network has closed or write timeout has been triggered due to no response from the client.
                        // TODO: Disconnect peer.
                    }
                }
            }