数据包的字节大小

时间:2011-06-23 03:36:33

标签: c# .net protocols packet

我正在尝试从C#NET应用程序实现此协议(http://developer.valvesoftware.com/wiki/Source_RCON_Protocol)。适用于我正在实施的代码的部分标题为“接收”。但是,我并不认为我在构造数据包时字节大小是正确的。

这是我构建数据包的功能......

    private static byte[] ConstructPacket(int request_id, int cmdtype, string cmd)
    {
        MemoryStream stream = new MemoryStream();
        using (BinaryWriter writer = new BinaryWriter(stream))
        {
            byte[] cmdBytes = ConvertStringToByteArray(cmd);
            int packetSize = 12 + cmdBytes.Length;

            // Packet Contents
            writer.Write((int)packetSize); // Byte size of Packet not including This
            writer.Write((int)request_id);  // 4 Bytes
            writer.Write((int)cmdtype);     // 4 Bytes
            writer.Write(cmdBytes);         // 8 Bytes ??

            // NULL String 1
            writer.Write((byte)0x00);
            writer.Write((byte)0x00);

            // NULL String 2
            writer.Write((byte)0x00);
            writer.Write((byte)0x00);

            // Memory Stream to Byte Array
            byte[] buffer = stream.ToArray();

            return buffer;
        }
    }

根据协议规范,packetSize是不包括其自身的数据包的字节大小。

第一个2(int)会使它成为8个字节...... “cmdBytes”,在这个特定的实例中是“testpass”将是8个字节,我相信...... 然后最后的2个空分隔字符串(如果我将它们设置为右)将是4个字节。

因此,根据我的计算,数据包应该是20个字节大,但似乎没有正常工作。我认为这些值应该都是正确的吗?我是否正确地为C#.NET设置了NULL delmited字符串?

2 个答案:

答案 0 :(得分:0)

你写了两个零太多。在示例中很容易看到,它们都以两个零结束,而不是四个。

答案 1 :(得分:0)

您应该在最后writer.Flush()之后致电writer.Write()。否则,在将所有内容写入流中之前,您将面临处置编写器的风险。