C# socket, ожидание поступления данных

Рейтинг: 0Ответов: 1Опубликовано: 27.06.2023

На socket устанавливаю соединение с удаленным оборудованием, черещ Send и Receive отправляю и получаю информацию, но при запросе определенной информации ответ приходит не полный. Как поставить socket.Receve на прослушку по таймауту, пока не получились все данные?

Ответы

▲ 0

Вытащил кусок кода из моего сервера. Сначала, мы получаем тип очереди проекта. Для определения его важности. Это послужит нам выполнить данные сразу или поставить в очередь, пока до него дойдет серверный тик и выполнит его. Дальше из буфера мы читаем 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();
        }
    }
}