コード例 #1
0
        public virtual void Read(NetworkPacket packet, NetworkFormat format)
        {
            _lock.TryEnterReadLock(Timeout.Infinite);
            {
                if (format.Secured)
                {
                    Encryption.Transform(packet);

                    switch (format.Command)
                    {
                    case 0x39:
                    case 0x3A:
                        TransFormDialog(packet);
                        Reader.Position = 6;
                        break;

                    default:
                        Reader.Position = 0;
                        break;
                    }
                }
                else
                {
                    Reader.Position = -1;
                }
                Reader.Packet = packet;
                format.Serialize(Reader);
            }
            _lock.ExitReadLock();
        }
コード例 #2
0
        private void SendFormat(NetworkFormat format)
        {
            if (format == null)
            {
                return;
            }

            lock (Writer)
            {
                if (!GetPacket(format))
                {
                    return;
                }

                var packet = Writer.ToPacket();
                {
                    if (ServerContext.Config.LogSentPackets)
                    {
                        if (this is GameClient)
                        {
                            Console.WriteLine("{0}: {1}", (this as GameClient)?.Aisling?.Username, packet);
                        }
                    }

                    if (format.Secured)
                    {
                        Encryption.Transform(packet);
                    }

                    var buffer = packet.ToArray();
                    Socket.Send(buffer);
                }
            }
        }
コード例 #3
0
 public void Send(NetworkFormat format)
 {
     if (Session.ConnectedSocket.Connected)
     {
         FlushAndSend(format);
     }
 }
コード例 #4
0
        public void Send(NetworkFormat format)
        {
            var queue = ServerContext.Config.QueuePackets;

catcher:
            try
            {
                if (queue)
                {
                    SendAsync(format);
                }
                else
                {
                    SendFormat(format);
                }

                Errors = 0;
            }
            catch
            {
                if (Errors++ <= ServerContext.Config.ClientPacketSendErrorLimit)
                {
                    Writer = new NetworkPacketWriter();
                    queue  = !queue;

                    goto catcher;
                }
            }
        }
コード例 #5
0
        public void Read(NetworkPacket packet, NetworkFormat format)
        {
            if (packet == null)
            {
                return;
            }

            lock (Reader)
            {
                if (format.Secured)
                {
                    Encryption.Transform(packet);

                    if (format.Command == 0x39 || format.Command == 0x3A)
                    {
                        TransFormDialog(packet);
                        Reader.Position = 0x6;
                    }
                    else
                    {
                        Reader.Position = 0x0;
                    }
                }
                else
                {
                    Reader.Position = -0x1;
                }

                Reader.Packet = packet;
                format.Serialize(Reader);
                Reader.Position = -0x1;
            }
        }
コード例 #6
0
        public virtual void Read(NetworkPacket packet, NetworkFormat format)
        {
            if (format.Secured)
            {
                Encryption.Transform(packet);

                if (format.Command == 0x39 || format.Command == 0x3A)
                {
                    TransFormDialog(packet);
                    Reader.Position = 6;
                }
                else
                {
                    Reader.Position = 0;
                }
            }
            else
            {
                Reader.Position = -1;
            }

            if (ServerContext.Config?.LogRecvPackets ?? false)
            {
                Console.WriteLine("r: {0}", packet);
            }


            Reader.Packet = packet;
            format.Serialize(Reader);
        }
コード例 #7
0
        public void FlushAndSend(NetworkFormat format)
        {
            lock (syncLock)
            {
                Writer.Position = 0;
                Writer.Write(format.Command);

                if (format.Secured)
                {
                    Writer.Write(Ordinal++);
                }

                format.Serialize(Writer);

                var packet = Writer.ToPacket();
                if (packet == null)
                {
                    return;
                }

                if (format.Secured)
                {
                    Encryption.Transform(packet);
                }

                var array = packet.ToArray();
                ServerSocket.Send(array, array.Length, SocketFlags.None);
            }
        }
コード例 #8
0
        public void Read(NetworkPacket packet, NetworkFormat format)
        {
            if (packet == null)
            {
                return;
            }

            if (format.Secured)
            {
                Encryption.Transform(packet);

                switch (format.Command)
                {
                case 0x39:
                case 0x3A:
                    TransFormDialog(packet);
                    Reader.Position = 6;
                    break;

                default:
                    Reader.Position = 0;
                    break;
                }
            }
            else
            {
                Reader.Position = -1;
            }

            Reader.Packet = packet;
            format.Serialize(Reader);
            Reader.Position = -1;
        }
コード例 #9
0
        public void Send(NetworkFormat format)
        {
            if (format.Delay != 0)
            {
                Thread.Sleep(format.Delay);
            }

            SendAsync(format);
        }
コード例 #10
0
        public override void Read(NetworkPacket packet, NetworkFormat format)
        {
            if (format.Secured)
            {
                Encryption.Transform(packet);
            }

            Reader.Packet = packet;
            format.Serialize(Reader);
        }
コード例 #11
0
        private void SendFormat(NetworkFormat format)
        {
            try
            {
                if (format == null)
                {
                    return;
                }

                lock (Writer)
                {
                    PreparePacketWriter(format);

                    var packet = Writer.ToPacket();
                    {
                        if (ServerContext.Config.LogSentPackets)
                        {
                            if (this is GameClient)
                            {
                                Console.WriteLine("{0}: {1}", (this as GameClient)?.Aisling?.Username, packet);
                            }
                        }

                        if (format.Secured)
                        {
                            Encryption.Transform(packet);
                        }

                        var         buffer    = packet.ToArray();
                        SocketError errorcode = SocketError.Success;

                        for (int i = 0; i < buffer.Length; i += 1024)
                        {
                            if (i + 1024 <= buffer.Length)
                            {
                                Socket.Send(buffer, i, 1024, SocketFlags.None, out errorcode);
                            }
                            else
                            {
                                Socket.Send(buffer, i, buffer.Length - i, SocketFlags.None, out errorcode);
                            }
                        }

                        if (errorcode != SocketError.Success)
                        {
                            Console.WriteLine(string.Format("[Network] Packet Error: {0} for Action {1}", errorcode, packet.Command));
                        }
                    }
                }
            }
            catch (Exception)
            {
                //ignore
            }
        }
コード例 #12
0
        private void PreparePacketWriter(NetworkFormat format)
        {
            Writer.Position = 0;
            Writer.Write(format.Command);

            if (format.Secured)
            {
                Writer.Write(Ordinal++);
            }

            format.Serialize(Writer);
        }
コード例 #13
0
        private bool GetPacket(NetworkFormat format)
        {
            Writer.Position = 0;
            Writer.Write(format.Command);

            if (format.Secured)
            {
                Writer.Write(Ordinal++);
            }

            format.Serialize(Writer);
            return(true);
        }
コード例 #14
0
        private void Enqueue(NetworkFormat format, NetworkPacket packet)
        {
            lock (packet)
            {
                if (format.Secured)
                {
                    Encryption.Transform(packet);
                }

                var data = packet.ToArray();


                CreateBuffers(data);
            }
        }
コード例 #15
0
        public void SendAsync(NetworkFormat format)
        {
            lock (_sendBuffers)
            {
                _sendBuffers.Enqueue(format);

                if (_sending)
                {
                    return;
                }

                _sending = true;
                Task.Run(() => SendBuffers());
            }
        }
コード例 #16
0
        public void SendAsync(NetworkFormat format)
        {
            lock (_sendBuffers)
            {
                _sendBuffers.Enqueue(format);

                if (_sending)
                {
                    return;
                }

                _sending = true;
                ThreadPool.QueueUserWorkItem(SendBuffers, this);
            }
        }
コード例 #17
0
        private NetworkPacket GetPacket(NetworkFormat format)
        {
            lock (Writer)
            {
                Writer.Position = 0;
                Writer.Write(format.Command);

                if (format.Secured)
                {
                    Writer.Write(Ordinal++);
                }

                format.Serialize(Writer);
                return(Writer.ToPacket());
            }
        }
コード例 #18
0
        private void SendFormat(NetworkFormat format)
        {
            if (!WorkSocket.Connected)
            {
                return;
            }

            if (format == null)
            {
                return;
            }

            var packet = GetPacket(format);
            {
                Enqueue(format, packet);
            }
        }
コード例 #19
0
        protected void HandleFormat(TClient client, NetworkFormat format)
        {
            //Sanity check on client.
            if (client == null)
            {
                return;
            }

            if (_handlers[format.Command] != null)
            {
                _handlers[format.Command].Invoke(this, new object[]
                {
                    client,
                    format
                });
            }
        }
コード例 #20
0
        private void SendFormat(NetworkFormat format)
        {
            if (!WorkSocket.Connected)
            {
                return;
            }

            if (format == null)
            {
                return;
            }

            var packet = GetPacket(format);
            {
                ServerContext.Info.Info(packet.ToString());
                Enqueue(format, packet);
            }
        }
コード例 #21
0
        public void FlushAndSend(NetworkFormat format)
        {
            if (Session.ConnectedSocket == null)
            {
                return;
            }

            if (!Session.ConnectedSocket.Connected)
            {
                return;
            }

            lock (Writer)
            {
                Writer.Position = 0;
                Writer.Write(format.Command);

                if (format.Secured)
                {
                    Writer.Write(Ordinal++);
                }

                format.Serialize(Writer);

                var packet = Writer.ToPacket();
                if (packet == null)
                {
                    return;
                }

                if (format.Secured)
                {
                    Encryption.Transform(packet);
                }

                var array = packet.ToArray();

                if (Session.ConnectedSocket.Connected)
                {
                    Session.ConnectedSocket.Send(array, SocketFlags.None);
                }
            }
        }
コード例 #22
0
        private void Enqueue(NetworkFormat format, NetworkPacket packet)
        {
            lock (packet)
            {
                if (format.Secured)
                {
                    Encryption.Transform(packet);
                }

                var data = packet.ToArray();

                if (format is ServerFormat3C)
                {
                    //    AddBuffer(data);
                }
                //else
                {
                    CreateBuffers(data);
                }
            }
        }
コード例 #23
0
        public NetworkClient <TClient> Send(NetworkFormat format)
        {
            if (this is LoginClient)
            {
                FlushAndSend(format);
                return(this);
            }

            lock (syncLock)
            {
                Writer.Position = 0;
                Writer.Write(format.Command);

                if (format.Secured)
                {
                    Writer.Write(Ordinal++);
                }

                format.Serialize(Writer);

                var packet = Writer.ToPacket();
                if (packet == null)
                {
                    return(null);
                }

                if (format.Secured)
                {
                    Encryption.Transform(packet);
                }


                var array = packet.ToArray();
                SendBuffer.Enqueue(array);
                //FlushBuffers();
            }

            return(this);
        }
コード例 #24
0
        public void FlushAndSend(NetworkFormat format)
        {
            if (!Socket.Connected)
            {
                return;
            }

            lock (_sendLock)
            {
                Writer.Position = 0;
                Writer.Write(format.Command);

                if (format.Secured)
                {
                    Writer.Write(Ordinal++);
                }

                format.Serialize(Writer);

                var packet = Writer.ToPacket();
                if (packet == null)
                {
                    return;
                }

                if (format.Secured)
                {
                    Encryption.Transform(packet);
                }

                var buffer = packet.ToArray();

                if (buffer.Length <= 0)
                {
                    return;
                }

                if (_sending)
                {
                    return;
                }

                _sending = true;

                try
                {
                    Socket.BeginSend(
                        buffer,
                        0,
                        buffer.Length,
                        SocketFlags.None,
                        SendCompleted,
                        Socket
                        );
                }
                catch (SocketException)
                {
                    //ignore
                }
            }
        }
コード例 #25
0
 public void Send(NetworkFormat format)
 {
     FlushAndSend(format);
 }
コード例 #26
0
 public static bool TryGetServerFormat(byte command, out NetworkFormat format)
 {
     return((format = GetServerFormat(command)) != null);
 }
コード例 #27
0
        private void SendFormat(NetworkFormat format)
        {
            if (format == null)
            {
                return;
            }

            lock (Writer)
            {
                Writer.Position = 0;
                Writer.Write(format.Command);

                if (format.Secured)
                {
                    Writer.Write(Ordinal++);
                }

                format.Serialize(Writer);

                var packet = Writer.ToPacket();


                if (_lastFormat == format.Command)
                {
                    ++_matches;
                }
                else
                {
                    _lastFormat = format.Command;
                    _matches    = 0;
                }

                var sendIt = _matches < (format is ServerFormat3C
                                 ? ServerContext.Config.PacketOverflowLimit
                                 : ServerContext.Config.ServerOverflowTolerate);

                if (ServerContext.Config.LogSentPackets)
                {
                    if (this is GameClient)
                    {
                        Console.WriteLine("{0}: {1}", (this as GameClient)?.Aisling?.Username, packet);
                    }
                }

                if (format.Secured)
                {
                    Encryption.Transform(packet);
                }


                if (!sendIt)
                {
                    return;
                }

                var buffer = packet.ToArray();

                if (ServerContext.Config.SendClientPacketsAsAsync)
                {
                    Socket.BeginSend(buffer, 0, buffer.Length, 0, SendCallback, Socket);
                    return;
                }

                Socket.Send(buffer);
            }
        }
コード例 #28
0
 public void Send(NetworkFormat format)
 {
     SendFormat(format);
 }