71 lines
2.0 KiB
C#
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;
|
|
}
|
|
}
|