我正在尝试从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字符串?
答案 0 :(得分:0)
你写了两个零太多。在示例中很容易看到,它们都以两个零结束,而不是四个。
答案 1 :(得分:0)
您应该在最后writer.Flush()
之后致电writer.Write()
。否则,在将所有内容写入流中之前,您将面临处置编写器的风险。