コード例 #1
0
        public void Send(PacketWriter packet)
        {
            if (packet.Opcode == 0)
            {
                return;
            }

            var buffer = packet.ReadDataToSend();

            if (Crypt.IsInitialized)
            {
                uint totalLength = (uint)packet.Size - 2;
                totalLength <<= 12;
                totalLength  |= ((uint)packet.Opcode & 0xFFF);

                var header = BitConverter.GetBytes(totalLength);

                Crypt.Encrypt(header);

                buffer[0] = header[0];
                buffer[1] = header[1];
                buffer[2] = header[2];
                buffer[3] = header[3];
            }

            var args = SocketAsyncEventArgsPool.Acquire();

            args.SetBuffer(buffer, 0, buffer.Length);
            args.Completed += OnSend;

            try
            {
                if (!clientSocket.SendAsync(args))
                {
                    OnSend(this, args);
                }
            }
            catch (Exception ex)
            {
                args.Completed -= OnSend;
                SocketAsyncEventArgsPool.Release(args);
                Disconnect();

                if (ex is ObjectDisposedException)
                {
                    return;
                }

                if (ex is SocketException)
                {
                    Log.outException(ex);
                    return;
                }

                throw;
            }

            Log.outDebug("Sent Opcode: 0x{0:X} ({0}) to Player: {1}", packet.Opcode, GetAccount() == null ? 0 : GetAccountId());
            PacketLog.WritePacket(clientSocket.RemoteEndPoint.ToString(), packet);
        }
コード例 #2
0
ファイル: WorldNetwork.cs プロジェクト: ovr/CypherCore
        private void Accept(SocketAsyncEventArgs args)
        {
            if (args == null)
            {
                args            = SocketAsyncEventArgsPool.Acquire();
                args.Completed += OnAccept;
            }
            else
            {
                args.AcceptSocket = null;
            }

            try
            {
                if (!Listener.AcceptAsync(args))
                {
                    OnAccept(this, args);
                }
            }
            catch (Exception ex)
            {
                args.Completed -= OnAccept;
                SocketAsyncEventArgsPool.Release(args);

                if (ex is ObjectDisposedException)
                {
                    return;
                }

                if (ex is SocketException)
                {
                    Log.outException(ex);
                    return;
                }

                throw;
            }
        }
コード例 #3
0
 private void OnSend(object sender, SocketAsyncEventArgs args)
 {
     args.Completed -= OnSend;
     SocketAsyncEventArgsPool.Release(args);
 }