コード例 #1
0
        protected void _HandleCompressedEncryptedPacket(Packet recievedPacket, int recievedBytes)
        {
            UInt32 crc = _enccom.GenerateCRC(recievedPacket.Data, recievedBytes - 2, Session.EncryptionKey, 0);

            byte packetCrcLow  = recievedPacket.Data[recievedBytes - 1];
            byte packetCrcHigh = recievedPacket.Data[recievedBytes - 2];
            byte crcHigh       = (byte)(crc >> 8);
            byte crcLow        = (byte)crc;

            if (crcLow != packetCrcLow || crcHigh != packetCrcHigh)
            {
                if (recievedPacket.PacetTypeEnum == SessionOp.NetStatResponse)
                {
                    _logger.Debug("Malformed Netstat, ignorning the crc");
                }
                else
                {
                    _logger.Warn("Compressed Encrypted Packet dropped due to CRC Mismatch");
                    return;
                }
            }

            Packet decompressedPacket = new Packet(496);

            Array.ConstrainedCopy(recievedPacket.Data, 0, decompressedPacket.Data, 0, 2);

            _enccom.Decrypt(recievedPacket.Data, Convert.ToUInt32(recievedBytes - 4), Session.EncryptionKey, 2);
            int decompressedBytes = _enccom.Decompress(recievedPacket.Data, recievedBytes - 5, decompressedPacket.Data, 491, 2, 2);

            if (decompressedBytes > 0)
            {
                decompressedPacket.Compressed = true;
                decompressedPacket.Size       = decompressedBytes + 2;
                Session.HandleSessionPacket(decompressedPacket);
            }
            else
            {
                recievedPacket.Size = recievedPacket.Size - 3;
                Session.HandleSessionPacket(recievedPacket);
            }
        }
コード例 #2
0
ファイル: ObjectGraph.cs プロジェクト: LunAnder/swgemu.client
        public void EstablishConnection(uint userId, byte[] sessionKey, IPAddress address, int port)
        {
            ConnectedAddress = address;
            ConnectedPort    = port;
            Session          = new Session();
            _Socket          = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            _SocketReader    = new SocketReader(Session, _Socket);
            _SocketWriter    = new SocketWriter(Session, _Socket);
            Session.Command  = SessionCommand.Connect;

            _logger.Debug("Connecting to zone server at {0}:{1}", address, port);

            _Socket.Connect(address, port);
            _SocketReader.Start().WaitOne(ConnectTimeout);
            _SocketWriter.Start().WaitOne(ConnectTimeout);

            var timeout = DateTime.Now.Add(ConnectTimeout);

            while (Session.Status != SessionStatus.Connected && Session.Status != SessionStatus.Error)
            {
                if (timeout <= DateTime.Now)
                {
                    _logger.Error("Timeout waiting for connecting to establish");
                    throw new TimeoutException("Timeout waiting for server conenction");
                }

                Thread.Sleep(TimeSpan.FromMilliseconds(ConnectTimeout.TotalMilliseconds / 10));
            }

            if (!Start().WaitOne(ConnectTimeout))
            {
                _logger.Error("ObjectGraph service failed to start in time");
                throw new TimeoutException("Timeout waiting for server conenction");
            }


            var clientIDMsg = new ClientIDMessage(userId, sessionKey);

            clientIDMsg.AddFieldsToData();

            Session.SendChannelA(clientIDMsg);


            var messages =
                Messages.WaitForMessages(Convert.ToInt32(ConnectTimeout.TotalMilliseconds),
                                         MessageOp.ErrorMessage, MessageOp.ClientPermissionsMessage);

            if (messages == null)
            {
                _logger.Error("Timeout waiting for ClientPermissionsMessage");
                throw new TimeoutException("Timeout waiting for server connection");
            }

            var errorMsg =
                Message.Create <ErrorMessage>(
                    messages.FirstOrDefault(cur => cur.MessageOpCodeEnum == MessageOp.ErrorMessage));

            if (errorMsg != null)
            {
                _logger.Error("Error getting client permission: [{0}] {1}", errorMsg.ErrorType, errorMsg.Message);
                throw new Exception(string.Format("[{0}] {1}", errorMsg.ErrorType, errorMsg.Message));
            }

            var permissionMessage =
                Message.Create <ClientPermissionsMessage>(
                    messages.FirstOrDefault(cur => cur.MessageOpCodeEnum == MessageOp.ClientPermissionsMessage));

            if (permissionMessage == null)
            {
                _logger.Error("Unknow packet when expecting ClientPermissionsMessage");
                throw new Exception("Unknown error connecting to server");
            }

            SelectedGalaxyOpen         = permissionMessage.GalaxyOpenFlag == 1;
            CanCreateCharacterOnGalaxy = permissionMessage.CharacterSlotOpenFlag == 1;
        }
コード例 #3
0
ファイル: ObjectGraph.cs プロジェクト: LunAnder/swgemu.client
        protected override void DoWork()
        {
            if (Session == null)
            {
                return;
            }

            while (Session.IncomingMessageQueue.Count > 0)
            {
                Message msg;

                if (!Session.IncomingMessageQueue.TryDequeue(out msg))
                {
                    continue;
                }

                Message transformed;
                IMessageParseFactory factory;
                if (!MessageFactories.TryGetValue(msg.MessageOpCode, out factory) || !factory.TryParse(msg.MessageOpCode, msg, out transformed))
                {
                    if (!FallbackFactory.TryParse(msg.MessageOpCode, msg, out transformed))
                    {
                        long tmpVal;
                        if (long.TryParse(msg.MessageOpCodeEnum.ToString(), out tmpVal))
                        {
                            _msgLogger.Trace(BitConverter.ToString(msg.Data).Replace("-", ""));
                            _msgLogger.Trace("{0}", msg.OpcodeCount);
                            _msgLogger.Trace("{0}", msg.SourcePacketType);
                        }
                        continue;
                    }
                }

                Messages.Add(transformed);


                //Func<Message, Message> createFunc = null;
                //Message transformed = null;
                //if (RegisteredObjects.TryGetValue(msg.MessageOpCode, out createFunc) &&
                //    (transformed = createFunc(msg)) != null)
                //{
                //    Messages.Add(transformed);

                SceneCreateObject obj = transformed as SceneCreateObject;
                if (obj != null)
                {
                    string objToCreate = null;
                    if (_crcMap.TryGetValue((uint)obj.ObjectCRC, out objToCreate))
                    {
                        _creatObjlogger.Debug("create obj {0}", objToCreate);
                    }
                }

                if (msg.MessageOpCodeEnum == MessageOp.CmdStartScene)
                {
                    _logger.Info("Got scene start! Trn: {0}", ((SceneStart)transformed).TerrainMap);
                }
                //}
                //else
                //{
                //    _logger.Warn("Unable to find registered message factory for {0}({1:X})", msg.MessageOpCodeEnum, msg.MessageOpCode);
                //}
            }

            Thread.Sleep(300);
        }