2024-06-01 12:28:32 +09:00

71 lines
2.0 KiB
C#

namespace ProtocolLib;
public class PacketStream
{
private Stream stream;
public PacketStream(Stream stream)
{
this.stream = stream;
}
public async ValueTask WritePacket(Packet packet)
{
byte[] buffer = this.PacketToBytes(packet);
await this.stream.WriteAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
}
public async ValueTask<Packet?> ReadPacket()
{
byte[] buffer = new byte[2 + sizeof(long) + sizeof(int)];
int r = await this.stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
if (r <= 0)
{
return null;
}
DataOperator dataOperator = (DataOperator) buffer[0];
DataType dataType = (DataType) buffer[1];
long packetNumber = BitConverter.ToInt64(buffer, 2);
int payloadSize = BitConverter.ToInt32(buffer, 10);
if (payloadSize < 0)
{
throw new IOException();
}
buffer = new byte[payloadSize];
r = await this.stream.ReadAsync(buffer, 0, buffer.Length).ConfigureAwait(false);
if (r <= 0)
{
throw new IOException();
}
Packet packet = new Packet()
{
Operator = dataOperator,
Type = dataType,
PacketNumber = packetNumber,
PayloadSize = payloadSize,
Payload = buffer,
};
return packet;
}
private byte[] PacketToBytes(Packet packet)
{
byte[] buffer = new byte[2 + sizeof(long) + sizeof(int) + packet.PayloadSize];
buffer[0] = (byte) packet.Operator;
buffer[1] = (byte) packet.Type;
byte[] temp = BitConverter.GetBytes(packet.PacketNumber);
Array.Copy(temp, 0, buffer, 2, temp.Length);
temp = BitConverter.GetBytes(packet.PayloadSize);
Array.Copy(temp, 0, buffer, 10, temp.Length);
Array.Copy(packet.Payload, 0, buffer, 14, packet.PayloadSize);
return buffer;
}
}