Exemple #1
0
        public async Task SendPacketAsync(RakSession session, Packet message)
        {
            foreach (Datagram datagram in Datagram.CreateDatagrams(message, session.MtuSize, session))
            {
                await SendDatagramAsync(session, datagram);
            }

            message.PutPool();
        }
Exemple #2
0
        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);
            }
        }
Exemple #3
0
 public MessageHandler(RakSession session, IMcpeClientMessageHandler handler) : base(session)
 {
     _messageDispatcher = new McpeClientMessageDispatcher(handler);
 }
Exemple #4
0
 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);
 }
Exemple #7
0
 public SafeMessageHandler(RakSession session, IMcpeClientMessageHandler handler) : base(session, handler)
 {
 }