ace/Source/ACE.Server/Network/PacketHeader.cs
fartwhif 9e065e89df WAN reliability, message queues, refactoring (#822)
* attempt to "group" network transmissions

* WAN sessions are now at least reliable enough to test with
refactor PacketFragmentHeader.Queue to match aclogview
refactor Packet.Header.Iteration to match aclogview
included some missing header flags from aclogview
include aclogview packet header flag names as comments
refactor typo in packet header flag names
2018-06-15 12:56:22 -04:00

61 lines
1.8 KiB
C#

using System.IO;
using System.Runtime.InteropServices;
using ACE.Common.Cryptography;
namespace ACE.Server.Network
{
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public class PacketHeader
{
public static uint HeaderSize { get; } = 20u;
public uint Sequence { get; set; }
public PacketHeaderFlags Flags { get; set; }
public uint Checksum { get; set; }
public ushort Id { get; set; }
public ushort Time { get; set; }
public ushort Size { get; set; }
public ushort Iteration { get; set; }
public PacketHeader() { }
public PacketHeader(BinaryReader payload)
{
Sequence = payload.ReadUInt32();
Flags = (PacketHeaderFlags)payload.ReadUInt32();
Checksum = payload.ReadUInt32();
Id = payload.ReadUInt16();
Time = payload.ReadUInt16();
Size = payload.ReadUInt16();
Iteration = payload.ReadUInt16();
}
public byte[] GetRaw()
{
var headerHandle = GCHandle.Alloc(this, GCHandleType.Pinned);
try
{
byte[] bytes = new byte[Marshal.SizeOf(typeof(PacketHeader))];
Marshal.Copy(headerHandle.AddrOfPinnedObject(), bytes, 0, bytes.Length);
return bytes;
}
finally
{
headerHandle.Free();
}
}
public uint CalculateHash32()
{
uint checksum = 0;
uint original = Checksum;
Checksum = 0xBADD70DD;
byte[] rawHeader = GetRaw();
checksum = Hash32.Calculate(rawHeader, rawHeader.Length);
Checksum = original;
return checksum;
}
public bool HasFlag(PacketHeaderFlags flags) { return (flags & Flags) != 0; }
}
}