数据包的字节大小

本文关键字:字节 数据包 | 更新日期: 2023-09-27 18:00:11

我正在尝试实现此协议(http://developer.valvesoftware.com/wiki/Source_RCON_Protocol)来自C#应用程序。适用于我正在实施的代码的部分在标题"接收"下。然而,我不确定在构建数据包时字节大小是否正确。

这是我构造数据包的函数。。。

    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个以null分隔的字符串(如果我设置正确的话)将是4个字节。

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

数据包的字节大小

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

您可能应该在最后一个writer.Write()之后调用writer.Flush()。否则,您将面临在编写器将所有内容写入流之前将其处理掉的风险。