Files
2026-08-27 11:22:54 -06:00

54 lines
1.6 KiB
C#

using System;
namespace Crysome.Common.Network;
public static class UdpTransport
{
public const int HeaderSize = 13;
public const int MaxFragmentSize = 60000;
public static byte[] BuildFragment(uint sessionToken, byte packetTypeId, uint frameSeq, ushort fragIdx, ushort fragCount, byte[] payloadData, int payloadOffset, int payloadLength)
{
byte[] array = new byte[13 + payloadLength];
int num = 0;
Buffer.BlockCopy(BitConverter.GetBytes(sessionToken), 0, array, num, 4);
num += 4;
array[num++] = packetTypeId;
Buffer.BlockCopy(BitConverter.GetBytes(frameSeq), 0, array, num, 4);
num += 4;
Buffer.BlockCopy(BitConverter.GetBytes(fragIdx), 0, array, num, 2);
num += 2;
Buffer.BlockCopy(BitConverter.GetBytes(fragCount), 0, array, num, 2);
num += 2;
Buffer.BlockCopy(payloadData, payloadOffset, array, num, payloadLength);
return array;
}
public static bool ParseHeader(byte[] datagram, int length, out uint sessionToken, out byte packetTypeId, out uint frameSeq, out ushort fragIdx, out ushort fragCount, out int payloadOffset, out int payloadLength)
{
sessionToken = 0u;
packetTypeId = 0;
frameSeq = 0u;
fragIdx = 0;
fragCount = 0;
payloadOffset = 0;
payloadLength = 0;
if (length < 13)
{
return false;
}
int num = 0;
sessionToken = BitConverter.ToUInt32(datagram, num);
num += 4;
packetTypeId = datagram[num++];
frameSeq = BitConverter.ToUInt32(datagram, num);
num += 4;
fragIdx = BitConverter.ToUInt16(datagram, num);
num += 2;
fragCount = BitConverter.ToUInt16(datagram, num);
payloadLength = length - (payloadOffset = num + 2);
return true;
}
}