System.ArgumentOutOfRangeException при обновлении соединения WebSocket?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Гость
 System.ArgumentOutOfRangeException при обновлении соединения WebSocket?

Сообщение Гость »

Я пытаюсь преобразовать игровой сервер с TCP на WebSockets. С TCP все работало нормально, но после реализации механизма протокола переключения для поддержки веб-сокетов я теперь получаю исключение при декодировании сообщения.
Я получаю исключение:
System.ArgumentOutOfRangeException: count ('-2103261134') must be a non-negative value. (Parameter 'count') Actual value was -2103261134.
at System.ArgumentOutOfRangeException.ThrowNegative[T](T value, String paramName) at System.IO.BinaryReader.ReadBytes(Int32 count) at Game.Networking.Packets.NetworkPacketDecoder.DecodePacketsFromBytes(Byte[] packet)
in /mnt/storage/dev/GameEmulator/Game.Networking/Packets/NetworkPacketDecoder.cs:line 24
at Game.Networking.Client.NetworkClientProcessComponent.OnReceivedAsync(Int32 bytesReceived)
in /mnt/storage/dev/GameEmulator/Game.Networking/Client/NetworkClientProcessComponent.cs:line 101
at Game.Networking.Client.NetworkClientProcessComponent.StartListening() in /mnt/storage/dev/GameEmulator/Game.Networking/Client/NetworkClientProcessComponent.cs:line 43
[15:37:24 ERR] System.ArgumentOutOfRangeException: count ('-2103252104') must be a non-negative value. (Parameter 'count') Actual value was -2103252104.
at System.ArgumentOutOfRangeException.ThrowNegative[T](T value, String paramName)
at System.IO.BinaryReader.ReadBytes(Int32 count)
at Game.Networking.Packets.NetworkPacketDecoder.DecodePacketsFromBytes(Byte[] packet)
in /mnt/storage/dev/GameEmulator/Game.Networking/Packets/NetworkPacketDecoder.cs:line 24
at Game.Networking.Client.NetworkClientProcessComponent.OnReceivedAsync(Int32 bytesReceived)
in /mnt/storage/dev/GameEmulator/Game.Networking/Client/NetworkClientProcessComponent.cs:line 101
at Game.Networking.Client.NetworkClientProcessComponent.StartListening()
in /mnt/storage/dev/GameEmulator/Game.Networking/Client/NetworkClientProcessComponent.cs:line 43

Вот единственный код, который я добавил, внутри частной асинхронной задачи OnReceivedAsync(int bytesReceived), которая вызывается при получении байтов.
var stringData = Encoding.UTF8.GetString(data);

if (stringData.Length >= 3 && Regex.IsMatch(stringData, "^GET"))
{
await UpgradeConnectionAsync(stringData);
return;
}

Метод UpgradeConnectionAsync:
private async Task UpgradeConnectionAsync(string data)
{
const string eol = "\r\n"; // HTTP/1.1 defines the sequence CR LF as the end-of-line marker

var response = Encoding.UTF8.GetBytes("HTTP/1.1 101 Switching Protocols" + eol
+ "Connection: Upgrade" + eol
+ "Upgrade: websocket" + eol
+ "Sec-WebSocket-Accept: " + Convert.ToBase64String(
System.Security.Cryptography.SHA1.Create().ComputeHash(
Encoding.UTF8.GetBytes(
new Regex("Sec-WebSocket-Key: (.*)").Match(data).Groups[1].Value.Trim() + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"
)
)
) + eol
+ eol);

await _networkClient.WriteToStreamAsync(response);
}

Сообщения, которые клиент отправляет на сервер (инструменты разработки Chrome, UTF8):
Binary Message 34 B
15:37:24.522
�NITRO-1-6-6HTML5

Binary Message 18 B
15:37:24.522
sdfdfdf!

Binary Message 6 B
15:37:44.522

$

Binary Message 6 B
15:38:04.802

$

Binary Message 6 B
15:38:24.802

$

Binary Message 6 B
15:38:44.802

$

Binary Message 6 B
15:39:04.802

$

Binary Message 6 B
15:40:05.802

$

Binary Message 6 B
15:41:06.803

$

NetworkPacketDecoder
public class NetworkPacketDecoder
{
private readonly NetworkingConstants _constants;

protected NetworkPacketDecoder(NetworkingConstants constants)
{
_constants = constants;
}

protected List DecodePacketsFromBytes(byte[] packet)
{
if (packet.Length < _constants.FrameLengthByteCount || packet.Length > _constants.BufferByteSize - _constants.FrameLengthByteCount)
{
return new List();
}

using var reader = new BinaryReader(new MemoryStream(packet));
var packetLength = BinaryPrimitives.ReadInt32BigEndian(reader.ReadBytes(4));

var packetData = reader.ReadBytes(packetLength);

using var br2 = new BinaryReader(new MemoryStream(packetData));
var packetId = BinaryPrimitives.ReadInt16BigEndian(br2.ReadBytes(2));

var content = new byte[packetData.Length - 2];
Buffer.BlockCopy(packetData, 2, content, 0, packetData.Length - 2);

var packets = new List();

if (reader.BaseStream.Length - 4 > packetLength)
{
var extra = new byte[reader.BaseStream.Length - reader.BaseStream.Position];
Buffer.BlockCopy(packet, (int)reader.BaseStream.Position, extra, 0, (int)(reader.BaseStream.Length - reader.BaseStream.Position));

packets.AddRange(DecodePacketsFromBytes(extra));
}

packets.Add(new NetworkPacket(packetId, content));
return packets;
}
}


Подробнее здесь: https://stackoverflow.com/questions/781 ... connection
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • System.ArgumentOutOfRangeException при обновлении соединения WebSocket?
    Anonymous » » в форуме C#
    0 Ответы
    40 Просмотры
    Последнее сообщение Anonymous
  • Метод не найден: 'System.String System.String.Format(System.IFormatProvider, System.String, System.Object)
    Anonymous » » в форуме C#
    0 Ответы
    141 Просмотры
    Последнее сообщение Anonymous
  • System.ArgumentOutOfRangeException при установке RadioButton IsChecked в MAUI
    Anonymous » » в форуме C#
    0 Ответы
    31 Просмотры
    Последнее сообщение Anonymous
  • System.ArgumentOutOfRangeException при установке RadioButton IsChecked в MAUI
    Anonymous » » в форуме Android
    0 Ответы
    16 Просмотры
    Последнее сообщение Anonymous
  • Ml.net LoadFromEnumerable всегда выдает System.ArgumentOutOfRangeException
    Anonymous » » в форуме C#
    0 Ответы
    18 Просмотры
    Последнее сообщение Anonymous

Вернуться в «C#»