【问题标题】:Byte size of Packet数据包的字节大小
【发布时间】:2011-09-20 21:35:17
【问题描述】:

我正在尝试从 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 个字节... 我相信在这个特定实例中是“testpass”的“cmdBytes”将是 8 个字节...... 那么最后的 2 个空分隔字符串(如果我设置正确的话)将是 4 个字节。

所以根据我的计算,数据包应该有 20 个字节大,但它似乎不能正常工作。我认为这些值是否都应该正确,我是否为 C# .NET 正确设置了 NULL 分隔字符串?

【问题讨论】:

    标签: c# .net protocols packet


    【解决方案1】:

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

    【讨论】:

    • 什么意思?像这样? // NULL String 1 writer.Write((byte)0); writer.Write((byte)0);
    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-10-10
      • 1970-01-01
      • 2018-07-23
      • 2016-12-23
      • 1970-01-01
      • 1970-01-01
      • 2014-12-17
      • 1970-01-01
      相关资源
      最近更新 更多