private async void RetransmissionLoop()
        {
            while (_listeningRunning)
            {
                Retransmission retransmission = null;

                lock (_retransmissions)
                {
                    if (_retransmissions.Count > 0)
                    {
                        retransmission = _retransmissions[0];
                    }
                }

                if (retransmission != null)
                {
                    LogManager.RuntimeLogger.Log($"[UdpNetworkClient] Retrying token {retransmission.ConfirmationToken}. {retransmission.RetriesRemaining} reties remaining");
                    _udpClient.Send(retransmission.DataBuffer, retransmission.DataBuffer.Length,
                                    retransmission.EndPoint);
                    retransmission.RetriesRemaining--;
                    if (retransmission.RetriesRemaining == 0)
                    {
                        LogManager.RuntimeLogger.Log($"[UdpNetworkClient] Retransmission failed. Too many retries");
                        // TODO Report connection lost?
                        lock (_retransmissions)
                        {
                            _retransmissions.RemoveAt(0);
                        }
                    }
                }

                await Task.Delay(RetransmissionPeriodMs);
            }
        }
Exemple #2
0
        private void SendData(IPEndPoint endPoint, UdpCommand command, byte[] data, Reliability reliability)
        {
            int        pos        = 0;
            ulong      token      = reliability == Reliability.Reliable ? GenerateConfirmationToken() : 0;
            UdpPackage udpPackage = new UdpPackage(command, reliability, token, data);

            byte[] datagram = new byte[udpPackage.Length];

            udpPackage.ToByteArray(datagram, pos);
            pos += udpPackage.Length;

            if (reliability == Reliability.Reliable)
            {
                Retransmission retransmission = new Retransmission(endPoint, datagram, token, RetransmissionCount);
                lock (_retransmissionQueue)
                {
                    _retransmissionQueue.Add(retransmission);
                }
            }

            _udpClient.Send(datagram, datagram.Length, endPoint);
        }
        public void Send(byte[] data, Reliability reliability = Reliability.Unreliable)
        {
            ulong token = reliability == Reliability.Reliable ? GenerateConfirmationToken() : 0;
            //Debug.WriteLine($"Confirmation token generated: {token}. Reliability: {reliability}");

            UdpPackage package = new UdpPackage(UdpCommand.Data, reliability, token, data);

            byte[] datagram = new byte[package.Length];
            package.ToByteArray(datagram, 0);

            Retransmission retransmission = new Retransmission(_serverEndPoint, datagram, token, RetriesCount);

            if (reliability == Reliability.Reliable)
            {
                lock (_retransmissions)
                {
                    _retransmissions.Add(retransmission);
                }
            }

            _udpClient.Send(datagram, datagram.Length, _serverEndPoint);
        }
Exemple #4
0
        private void RetransmitAll()
        {
            lock (_retransmissionQueue)
            {
                for (int i = 0; i < _retransmissionQueue.Count; i++)
                {
                    Retransmission retransmission = _retransmissionQueue[i];

                    if (retransmission.RetriesRemaining == 0 || retransmission.MarkedAsCanceled || retransmission.MarkedAsSuccessful)
                    {
                        if (!retransmission.MarkedAsSuccessful)
                        {
                            LogManager.RuntimeLogger.Log(
                                $"[UdpNetworkServer] Retransmission failed. Too many retries");
                            foreach (var entry in _retransmissionQueue)
                            {
                                if (entry.EndPoint.Equals(retransmission.EndPoint))
                                {
                                    entry.MarkedAsCanceled =
                                        true; // Discard all retransmissions associated with this EndPoint.
                                }
                            }
                            // TODO Mark player as disconnected?
                        }

                        _retransmissionQueue.RemoveAt(i);
                        i--;
                    }
                    else
                    {
                        //LogManager.RuntimeLogger.Log($"[UdpNetworkServer] Retrying token {retransmission.ConfirmationToken}");
                        _udpClient.Send(retransmission.DataBuffer, retransmission.DataBuffer.Length,
                                        retransmission.EndPoint);
                        retransmission.RetriesRemaining--;
                    }
                }
            }
        }