Ошибка 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;
Другие вопросы по тегам