数据包的字节大小
本文关键字:字节 数据包 | 更新日期: 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()
。否则,您将面临在编写器将所有内容写入流之前将其处理掉的风险。