Search code examples
c#lidgren

Casting enums to bytes and sending them lidgren


I have this code for receiving messages:

private void DataMessage(NetIncomingMessage msg)
{
    NetOutgoingMessage outmsg = server.CreateMessage();
    DataType data = (DataType)msg.ReadByte();
    switch (data)
    {
        case DataType.DATATYPEMSG:
            string s = msg.ReadString();
            Console.WriteLine(s);
            outmsg.Write(s);
            outmsg.Write((byte)DataType.DATATYPEMSG);
            server.SendToAll(outmsg,NetDeliveryMethod.ReliableUnordered);
            break;
        case DataType.DATATYPEOTHER:
            outmsg.Write((byte)DataType.DATATYPEMSG);
            outmsg.Write("please try this again later");
            server.SendMessage(outmsg,msg.SenderConnection,NetDeliveryMethod.ReliableUnordered);
                break;
        case DataType.DATATYPEREQUEST:
            break;
        default: msg.SenderConnection.Disconnect("if you believe you where wrongly picked up for editing the code please contact the developer");
            break;
    }
}

and this code for sending them:

internal void sendmsg(string v)
{
    NetOutgoingMessage outmsg = tclient.CreateMessage(v);
    outmsg.Write((byte)DataType.DATATYPEMSG);
    tclient.SendMessage(outmsg, NetDeliveryMethod.ReliableUnordered);
}

and if the message ever reaches the server it only calls the default and disconnects the user.


Solution

  • When you create the message you write the message text before DataType, but when you receive the message you expect DataType to appear before the text.

    You can fix it by writing DataType before the text, like this:

    internal void sendmsg(string v)
    {
        NetOutgoingMessage outmsg = tclient.CreateMessage();
        outmsg.Write((byte)DataType.DATATYPEMSG);
        outmsg.Write(v);
        tclient.SendMessage(outmsg, NetDeliveryMethod.ReliableUnordered);
    }