Я пытаюсь преобразовать игровой сервер с 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
System.ArgumentOutOfRangeException при обновлении соединения WebSocket? ⇐ C#
Место общения программистов C#
1710540569
Anonymous
Я пытаюсь преобразовать игровой сервер с 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;
}
}
Подробнее здесь: [url]https://stackoverflow.com/questions/78161817/system-argumentoutofrangeexception-when-upgrading-websocket-connection[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия