Ошибка XNA и Lidgren: Вы пытаетесь прочитать размер буфера в прошлом?
Я пытаюсь создать онлайн-игру, используя XNA и Lidgren Networking Library. Однако сейчас у меня возникают проблемы при отправке и получении любых сообщений без получения ошибки: "Попытка чтения за пределами размера буфера - вероятно, это вызвано несовпадением операций записи / чтения, разного размера или порядка".
Я отправляю сообщения клиенту так:
if (btnStart.isClicked && p1Ready == "Ready")
{
btnStart.isClicked = false;
NetOutgoingMessage om = server.CreateMessage();
CurrentGameState = GameState.City;
om.Write((byte)PacketTypes.Start);
server.SendMessage(om, server.Connections, NetDeliveryMethod.Unreliable, 0);
numPlayers = 2;
Console.WriteLine("Game started.");
}
Где PacketTypes.Start является частью перечисления, настроенного для различения разных сообщений.
Клиент получает это сообщение так:
if (joining)
{
NetIncomingMessage incMsg;
while ((incMsg = client.ReadMessage()) != null)
{
switch (incMsg.MessageType)
{
case NetIncomingMessageType.Data:
if (incMsg.ReadByte() == (byte)PacketTypes.Ready)
{
p1Ready = "Ready";
}
else if (incMsg.ReadByte() == (byte)PacketTypes.Start)
{
CurrentGameState = GameState.City;
Console.WriteLine("Game started");
numPlayers = 2;
}
break;
default:
Console.WriteLine("Server not found, Retrying...");
break;
}
}
}
Но что бы я ни пытался, я все равно получаю эту ошибку. Пожалуйста, любая помощь будет оценена.
1 ответ
Решение
Когда вы отправляете их, вы записываете только один байт:
om.Write((byte)PacketTypes.Start);
Но прочитайте два, когда вы получите их:
// One read here
if (incMsg.ReadByte() == (byte)PacketTypes.Ready)
{
p1Ready = "Ready";
}
// Second read here
else if (incMsg.ReadByte() == (byte)PacketTypes.Start)
редактировать
Чтобы решить эту проблему, измените свой код на это:
case NetIncomingMessageType.Data:
byte type = incMsg.ReadByte(); // Read one byte only
if (type == (byte)PacketTypes.Ready)
{
p1Ready = "Ready";
}
else if (type == (byte)PacketTypes.Start)
{
CurrentGameState = GameState.City;
Console.WriteLine("Game started");
numPlayers = 2;
}
break;