Вытащил кусок кода из моего сервера. Сначала, мы получаем тип очереди проекта. Для определения его важности. Это послужит нам выполнить данные сразу или поставить в очередь, пока до него дойдет серверный тик и выполнит его. Дальше из буфера мы читаем 2 байта - это будет длина нашего пакета, в типе short
. Дальше выделяем память под оставшиеся входящие данные и через цикл while с учетом отступа 3 байтов дочитываем оставшиеся байты из потока. В моем случаи, преобразую в структуру Packet
, где я выделяю те данные пакета, которые нужны. И в зависимости от типа очереди выполняю дальше согласно сервисам opcode.
public enum PacketImportance : byte
{
None,
Importance
}
private async Task ReadAsync()
{
while (true)
{
try
{
byte[] buffer = new byte[sizeof(byte)];
int bytesRead = await ClientNetworkStream?.ReadAsync(buffer, offset: 0, buffer.Length);
PacketImportance packetImportance = (PacketImportance)buffer[0];
buffer = new byte[sizeof(short)];
bytesRead = await ClientNetworkStream.ReadAsync(buffer, offset: 0, buffer.Length);
if (bytesRead == 0 || bytesRead != sizeof(short))
throw null;
short packetLenght = BitConverter.ToInt16(buffer, startIndex: 0);
buffer = new byte[packetLenght - (sizeof(short) + sizeof(byte))];
int countPackets = 0;
while (countPackets < (packetLenght - (sizeof(short) + sizeof(byte))))
{
bytesRead = await ClientNetworkStream.ReadAsync
(buffer, countPackets, buffer.Length - countPackets);
countPackets += bytesRead;
}
if (countPackets != packetLenght - (sizeof(short) + sizeof(byte)))
throw null;
if (packetImportance == PacketImportance.None)
ClientPacketProcessor.AddQueue(buffer.BuildBufferToPacket(extraBytes: 0), this);
else
ClientPacketProcessor.AddQueueOutOfTurn(buffer.BuildBufferToPacket(extraBytes: 0), this);
}
catch
{
if (IsDisconnected)
return;
Termination();
}
}
}