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