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); } }
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; }
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); }