public async Task SendPacketAsync(RakSession session, Packet message) { foreach (Datagram datagram in Datagram.CreateDatagrams(message, session.MtuSize, session)) { await SendDatagramAsync(session, datagram); } message.PutPool(); }
internal async Task SendDatagramAsync(RakSession session, Datagram datagram) { if (datagram.MessageParts.Count == 0) { Log.Warn($"Failed to send #{datagram.Header.DatagramSequenceNumber.IntValue()}"); datagram.PutPool(); return; } if (datagram.TransmissionCount > 10) { if (Log.IsDebugEnabled) { Log.Warn($"Retransmission count exceeded. No more resend of #{datagram.Header.DatagramSequenceNumber.IntValue()} Type: {datagram.FirstMessageId} (0x{datagram.FirstMessageId:x2}) for {session.Username}"); } datagram.PutPool(); Interlocked.Increment(ref ServerInfo.NumberOfFails); //TODO: Disconnect! Because of encryption, this connection can't be used after this point return; } datagram.Header.DatagramSequenceNumber = Interlocked.Increment(ref session.DatagramSequenceNumber); datagram.TransmissionCount++; datagram.RetransmitImmediate = false; byte[] buffer = ArrayPool <byte> .Shared.Rent(1600); int length = (int)datagram.GetEncoded(ref buffer); datagram.Timer.Restart(); if (!session.WaitingForAckQueue.TryAdd(datagram.Header.DatagramSequenceNumber.IntValue(), datagram)) { Log.Warn($"Datagram sequence unexpectedly existed in the ACK/NAK queue already {datagram.Header.DatagramSequenceNumber.IntValue()}"); datagram.PutPool(); } //lock (session.SyncRoot) { await SendDataAsync(buffer, length, session.EndPoint); ArrayPool <byte> .Shared.Return(buffer); } }
public MessageHandler(RakSession session, IMcpeClientMessageHandler handler) : base(session) { _messageDispatcher = new McpeClientMessageDispatcher(handler); }
private void EnqueueAck(RakSession session, int sequenceNumber) { session.OutgoingAckQueue.Enqueue(sequenceNumber); session.SignalTick(); }
protected BedrockMessageHandlerBase(RakSession session) { _session = session; }
public BedrockMessageHandler(RakSession session, IServerManager serverManager, PluginManager pluginManager) : base(session) { _pluginManager = pluginManager; Handler = new LoginMessageHandler(this, session, serverManager); }
public SafeMessageHandler(RakSession session, IMcpeClientMessageHandler handler) : base(session, handler) { }