public void WritePacket(IPacket packet) { /* Writes packet to a buffer, * then sends the buffer to the socket */ MemoryStream tempStream = new MemoryStream(); packet.WritePacket(new PacketWriter(tempStream)); byte[] buffer = new byte[tempStream.Length]; tempStream.Read(buffer, 0, buffer.Length); buffer = (buffer.Skip(HeaderSize).ToArray()); CoCCrypto.Encrypt(buffer); CoCStream.Write(buffer, 0, buffer.Length); }
/// <summary> /// Sends the specified packet to the socket asynchronously. /// </summary> /// <param name="packet">The <see cref="IPacket"/> that will be sent.</param> /// <exception cref="System.ArgumentNullException"/> public void SendPacket(IPacket packet) { if (packet == null) { throw new ArgumentNullException("packet"); } using (var dePacketWriter = new PacketWriter(new MemoryStream())) { packet.WritePacket(dePacketWriter); var body = ((MemoryStream)dePacketWriter.BaseStream).ToArray(); CoCCrypto.Encrypt(body); if (packet is UpdateKeyPacket) { UpdateCiphers(Seed, ((UpdateKeyPacket)packet).Key); // handle update key packet } using (var enPacketWriter = new PacketWriter(new MemoryStream())) // write header { enPacketWriter.WriteUInt16(packet.ID); enPacketWriter.WriteInt24(body.Length); enPacketWriter.WriteUInt16(0); // the unknown or the packet version enPacketWriter.Write(body, 0, body.Length); var rawPacket = ((MemoryStream)enPacketWriter.BaseStream).ToArray(); // should avoid new objs var args = new SocketAsyncEventArgs(); args.SetBuffer(rawPacket, 0, rawPacket.Length); if (!Connection.SendAsync(args)) { AsyncOperationCompleted(Connection, args); } } } }