コード例 #1
0
        private void SendDatagram(PlayerNetworkSession session, Datagram datagram)
        {
            if (datagram.MessageParts.Count == 0)
            {
                datagram.PutPool();
                Log.WarnFormat("Failed to resend #{0}", datagram.Header.datagramSequenceNumber.IntValue());
                return;
            }

            datagram.Header.datagramSequenceNumber = Interlocked.Increment(ref session.DatagramSequenceNumber);

            datagram.TransmissionCount++;

            byte[] data = datagram.Encode();

            datagram.Timer.Restart();

            if (!session.WaitingForAcksQueue.TryAdd(datagram.Header.datagramSequenceNumber.IntValue(), datagram))
            {
                Log.Warn(string.Format("Datagram sequence unexpectedly existed in the ACK/NAK queue already {0}", datagram.Header.datagramSequenceNumber.IntValue()));
            }
            //datagram.PutPool();

            lock (session.SyncRoot)
            {
                SendData(data, session.EndPoint);
            }
        }
コード例 #2
0
ファイル: MiNetServer.cs プロジェクト: IceCruelStuff/MiNET
        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);
            }
        }
コード例 #3
0
        internal void SendDatagram(PlayerNetworkSession session, Datagram datagram)
        {
            if (datagram.MessageParts.Count == 0)
            {
                datagram.PutPool();
                Log.WarnFormat("Failed to resend #{0}", datagram.Header.datagramSequenceNumber.IntValue());
                return;
            }

            if (datagram.TransmissionCount > 10)
            {
                if (Log.IsDebugEnabled)
                {
                    Log.WarnFormat("Retransmission count exceeded. No more resend of #{0} Type: {2} (0x{2:x2}) for {1}",
                                   datagram.Header.datagramSequenceNumber.IntValue(),
                                   session.Username,
                                   datagram.FirstMessageId);
                }

                datagram.PutPool();

                Interlocked.Increment(ref ServerInfo.NumberOfFails);
                return;
            }

            datagram.Header.datagramSequenceNumber = Interlocked.Increment(ref session.DatagramSequenceNumber);
            datagram.TransmissionCount++;
            datagram.RetransmitImmediate = false;

            //byte[] data = datagram.Encode();
            byte[] data;
            var    lenght = (int)datagram.GetEncoded(out data);

            datagram.Timer.Restart();

            if (!session.WaitingForAcksQueue.TryAdd(datagram.Header.datagramSequenceNumber.IntValue(), datagram))
            {
                Log.Warn(string.Format("Datagram sequence unexpectedly existed in the ACK/NAK queue already {0}", datagram.Header.datagramSequenceNumber.IntValue()));
            }

            lock (session.SyncRoot)
            {
                SendData(data, lenght, session.EndPoint);
            }
        }
コード例 #4
0
ファイル: MiNetServer.cs プロジェクト: DarkSeraphim/MiNET
        internal void SendDatagram(PlayerNetworkSession session, Datagram datagram)
        {
            if (datagram.MessageParts.Count == 0)
            {
                datagram.PutPool();
                Log.WarnFormat("Failed to resend #{0}", datagram.Header.datagramSequenceNumber.IntValue());
                return;
            }

            if (datagram.TransmissionCount > 10)
            {
                if (Log.IsDebugEnabled)
                {
                    Log.WarnFormat("TIMEOUT, Retransmission count remove from ACK queue #{0} Type: {2} (0x{2:x2}) for {1}",
                                   datagram.Header.datagramSequenceNumber.IntValue(),
                                   session.Username,
                                   datagram.FirstMessageId);
                }

                datagram.PutPool();

                Interlocked.Increment(ref ServerInfo.NumberOfFails);
                return;
            }

            datagram.Header.datagramSequenceNumber = Interlocked.Increment(ref session.DatagramSequenceNumber);
            datagram.TransmissionCount++;

            byte[] data = datagram.Encode();

            datagram.Timer.Restart();

            if (!session.WaitingForAcksQueue.TryAdd(datagram.Header.datagramSequenceNumber.IntValue(), datagram))
            {
                Log.Warn(string.Format("Datagram sequence unexpectedly existed in the ACK/NAK queue already {0}", datagram.Header.datagramSequenceNumber.IntValue()));
            }

            lock (session.SyncRoot)
            {
                SendData(data, session.EndPoint);
                Thread.Sleep(12);
            }
        }
コード例 #5
0
        private void SendDatagram(IPEndPoint senderEndpoint, Datagram datagram)
        {
            PlayerNetworkSession session;

            if (_playerSessions.TryGetValue(senderEndpoint, out session))
            {
                if (datagram.MessageParts.Count != 0)
                {
                    //if (!isResend)
                    {
                        datagram.Header.datagramSequenceNumber = Interlocked.Increment(ref session.DatagramSequenceNumber);
                    }

                    byte[] data = datagram.Encode();

                    SendData(data, senderEndpoint, session.SyncRoot);

                    datagram.TransmissionCount++;
                    datagram.Timer.Restart();

                    if (!session.Player.IsBot)
                    {
                        session.WaitingForAcksQueue.TryAdd(datagram.Header.datagramSequenceNumber, datagram);
                    }
                }

                if (session.Player.IsBot)
                {
                    foreach (MessagePart part in datagram.MessageParts)
                    {
                        part.PutPool();
                    }

                    datagram.PutPool();
                }
            }
        }
コード例 #6
0
ファイル: MiNetServer.cs プロジェクト: MrGenga/MiNET
		private void SendDatagram(PlayerNetworkSession session, Datagram datagram)
		{
			if (datagram.MessageParts.Count == 0)
			{
				datagram.PutPool();
				Log.WarnFormat("Failed to resend #{0}", datagram.Header.datagramSequenceNumber.IntValue());
				return;
			}

			datagram.Header.datagramSequenceNumber = Interlocked.Increment(ref session.DatagramSequenceNumber);

			datagram.TransmissionCount++;

			byte[] data = datagram.Encode();

			datagram.Timer.Restart();

			if (!session.WaitingForAcksQueue.TryAdd(datagram.Header.datagramSequenceNumber.IntValue(), datagram))
			{
				Log.Warn(string.Format("Datagram sequence unexpectedly existed in the ACK/NAK queue already {0}", datagram.Header.datagramSequenceNumber.IntValue()));
			}

			lock (session.SyncRoot)
			{
				SendData(data, session.EndPoint);
			}
		}
コード例 #7
0
ファイル: MiNetServer.cs プロジェクト: Hetal728/MiNET
        private void SendDatagram(IPEndPoint senderEndpoint, Datagram datagram)
        {
            PlayerNetworkSession session;
            if (_playerSessions.TryGetValue(senderEndpoint, out session))
            {
                if (datagram.MessageParts.Count != 0)
                {
                    //if (!isResend)
                    {
                        datagram.Header.datagramSequenceNumber = Interlocked.Increment(ref session.DatagramSequenceNumber);
                    }

                    byte[] data = datagram.Encode();

                    SendData(data, senderEndpoint, session.SyncRoot);

                    datagram.TransmissionCount++;
                    datagram.Timer.Restart();

                    if (!session.Player.IsBot)
                    {
                        session.WaitingForAcksQueue.TryAdd(datagram.Header.datagramSequenceNumber, datagram);
                    }
                }

                if (session.Player.IsBot)
                {
                    foreach (MessagePart part in datagram.MessageParts)
                    {
                        part.PutPool();
                    }

                    datagram.PutPool();
                }
            }
        }
コード例 #8
0
ファイル: MiNetServer.cs プロジェクト: yungtechboy1/MiNET
        private void SendDatagram(IPEndPoint senderEndpoint, Datagram datagram)
        {
            PlayerNetworkSession session;
            if (_playerSessions.TryGetValue(senderEndpoint, out session))
            {
                if (datagram.MessageParts.Count != 0)
                {
                    //if (!isResend)
                    {
                        datagram.Header.datagramSequenceNumber = Interlocked.Increment(ref session.DatagramSequenceNumber);
                    }

                    byte[] data = datagram.Encode();

                    if (!session.Player.IsBot)
                    {
                        if (!session.WaitingForAcksQueue.TryAdd(datagram.Header.datagramSequenceNumber.IntValue(), datagram))
                        {
                            Log.Warn(string.Format("Datagram sequence unexpectedly existed in the ACK/NAK queue already {0}", datagram.Header.datagramSequenceNumber.IntValue()));
                        }
                    }

                    datagram.TransmissionCount++;

                    SendData(data, senderEndpoint, session.SyncRoot);

                    datagram.Timer.Restart();
                }

                if (session.Player.IsBot)
                {
                    foreach (MessagePart part in datagram.MessageParts)
                    {
                        part.PutPool();
                    }

                    datagram.PutPool();
                }
            }
        }
コード例 #9
0
        private void SendDatagram(PlayerNetworkSession session, Datagram datagram, bool updateCounter)
        {
            if (datagram.MessageParts.Count == 0)
            {
                datagram.PutPool();
                Log.WarnFormat("Failed to resend #{0}", datagram.Header.datagramSequenceNumber.IntValue());
                return;
            }

            if (updateCounter)
            {
                datagram.Header.datagramSequenceNumber = Interlocked.Increment(ref session.DatagramSequenceNumber);
            }

            datagram.TransmissionCount++;

            byte[] data = datagram.Encode();

            datagram.Timer.Restart();

            if (!session.WaitingForAcksQueue.TryAdd(datagram.Header.datagramSequenceNumber.IntValue(), datagram))
            {
                Log.Warn(string.Format("Datagram sequence unexpectedly existed in the ACK/NAK queue already {0}", datagram.Header.datagramSequenceNumber.IntValue()));
            }

            lock (session.SyncRoot)
            {
                SendData(data, session.EndPoint, session.SyncRoot);
                int sndDelay = (int) (50f/4f);
                sndDelay = sndDelay + (20*(1/(datagram.Header.datagramSequenceNumber.IntValue() + 1)));
                //Thread.Sleep(sndDelay); // Really important to slow down speed a bit
            }
        }