private void HandleNetwork() { while (true) { if (ShuttingDown) { return; } for (int i = 0; i < Clients.Count; i++) { //TODO: Kick client due to keep alive timeouts. while (Clients[i].Client.NetworkManager.DataAvailable) { try { /* S <- P <- C * Proxying data from client to server. */ var rawPacket = (byte[])null; // raw encrypted packet var decryptedPacket = (byte[])null; var packet = Clients[i].Client.NetworkManager.ReadPacket(out rawPacket, out decryptedPacket); // receive data from client if (packet != null) { HandlePacket(Clients[i], packet); if (rawPacket != null) { Clients[i].Server.NetworkManager.CoCStream.Write(rawPacket, 0, rawPacket.Length); // sends data back to server PacketDumper.LogPacket(packet, PacketDirection.Server, decryptedPacket); PacketLog.LogData(packet, PacketDirection.Server); } } } catch (Exception ex) { ExceptionLog.LogData(ex); Clients.RemoveAt(i); goto ResetLoop; } } if (Clients[i].Server == null) { continue; } while (Clients[i].Server.NetworkManager.DataAvailable) { try { /* S -> P -> C * Proxying data from server to client. */ var rawPacket = (byte[])null; var decryptedPacket = (byte[])null; var packet = Clients[i].Server.NetworkManager.ReadPacket(out rawPacket, out decryptedPacket); // receive data from server if (packet != null) { HandlePacket(Clients[i], packet); if (rawPacket != null) { Clients[i].Client.NetworkManager.CoCStream.Write(rawPacket, 0, rawPacket.Length); // sends data back to client PacketDumper.LogPacket(packet, PacketDirection.Client, decryptedPacket); PacketLog.LogData(packet, PacketDirection.Client); } } } catch (Exception ex) { ExceptionLog.LogData(ex); Clients.RemoveAt(i); goto ResetLoop; } } continue; ResetLoop: break; } Thread.Sleep(1); } }
public IPacket ReadPacket(out byte[] rawPacket, out byte[] decryptedPacket) { /* Receive data from the socket, saves it a buffer, * then reads packet from the buffer. */ var timeout = DateTime.Now.AddMilliseconds(500); // 500ms while (DataAvailable && DateTime.Now < timeout) { CoCStream.ReadToBuffer(); // reads data saves it a buffer //var packetBuffer = new PacketBuffer(CoCStream.ReadBuffer.ToArray()); var enPacketReader = new PacketReader(CoCStream.ReadBuffer); // read header var packetID = enPacketReader.ReadUInt16(); var packetLength = enPacketReader.ReadInt24(); var packetVersion = enPacketReader.ReadUInt16(); // read body if (packetLength > enPacketReader.BaseStream.Length) // check if data is enough data is avaliable in the buffer { continue; } var encryptedData = GetPacketBody(packetLength); var decryptedData = (byte[])encryptedData.Clone(); // cloning just cause we want the encrypted data CoCCrypto.Decrypt(decryptedData); var dePacketReader = new PacketReader(new MemoryStream(decryptedData)); var packet = CreatePacketInstance(packetID); if (packet is UnknownPacket) { packet = new UnknownPacket { ID = packetID, Length = packetLength, Version = packetVersion }; ((UnknownPacket)packet).EncryptedData = encryptedData; } decryptedPacket = decryptedData; rawPacket = ExtractRawPacket(packetLength); //CoCStream.ReadBuffer = new MemoryStream(4096); //CoCStream.Write(packetBuffer.Buffer, 0, packetBuffer.Buffer.Length); try { packet.ReadPacket(dePacketReader); } catch (Exception ex) { if (ExceptionLog != null) { ExceptionLog.LogData(ex); } } return(packet); } decryptedPacket = null; rawPacket = null; return(null); }