协议缓冲区发送数据包 Header C#
Protocol buffer sending Packet with Header C#
你好,我有一个关于 Proto 缓冲区的问题,我从在线游戏中嗅探数据包,它使用 Proto 缓冲区,所以我尝试了很多次通过 proto 缓冲区再次发送这个数据包,但我不能它没有给出任何动作,我让控制台应用程序得到结果,我发现结果我不完整,因为有长度和数据包编号并且 header 没有出现在结果中我可以发送数据包所以有办法发送 header 和带有原始缓冲区的数据包 ID 而不改变它们
这是我的代码:
[ProtoContract]
public class Person
{
//[ProtoMember(0)]
//public string Name { get; set; }
public ushort Length;
public uint PacketNumer;
[ProtoMember(1, IsRequired = true)]
public uint UID;
[ProtoMember(2, IsRequired = true)]
public uint X;
[ProtoMember(3, IsRequired = true)]
public uint Y;
[ProtoMember(4, IsRequired = true)]
public uint TimeStamp;
[ProtoMember(5, IsRequired = true)]
public uint JumpStyle;
[ProtoMember(6, IsRequired = true)]
public uint Direction;
[ProtoMember(7, IsRequired = true)]
public uint FromX;
[ProtoMember(8, IsRequired = true)]
public uint FromY;
[ProtoMember(9, IsRequired = true)]
public uint MapID;
}
static void Main(string[] args)
{
Person input = new Person
{
UID = 12786811,
X = 430,
Y = 405,
TimeStamp = (uint)Environment.TickCount,
JumpStyle = 137,
Direction = 1,
FromX = 427,
FromY = 410,
MapID = 1002
};
var stream = new MemoryStream();
Serializer.SerializeWithLengthPrefix(stream, input, PrefixStyle.Fixed32);
Console.WriteLine(BitConverter.ToString(stream.GetBuffer()));
Person result;
//object output;
result = Serializer.DeserializeWithLengthPrefix<Person>(stream, PrefixStyle.Base128);
Console.ReadLine();
}
我从游戏中嗅探到的数据包:
2F 00 1A 27 08 FB B8 8C 06 38 BC 03 40 FC 02 48 9B C4 BF 40 60 89 01 68 07 70 BB 03 78 FA 02 88 01 CF 0F A0 01 FF FF FF FF FF FF FF FF FF 01
这是 App 的结果:
1E-00-00-00-08-FB-B8-8C-06-10-AE-03-18-95-03-20-A0-AB-B3-41-28-89-01-30-01-38-AB-03-40-9A-03-48-CF-0F
我想发送数据包,就像我用 header 和偏移量 2 中的数据包 ID 嗅探的数据包>> 1A 27
有办法吗?
谢谢
这里的前缀显然不是fixed-32;它可能是 varint(base-128),所以第一个改变就是使用它。
现在,您提到了数据包编号和长度。如果这些不是合适的 protobuf 格式,那么简单:您可能需要手动编写 header。我知道 解码 public API 上的原始 varint,但我不记得是否有 编码的代码 一个 - 但是:它最终并不是很复杂。所以:最坏的情况,自己写前几个字节。
最后:永远不要使用 GetBuffer(),除非您要捕获 Length 并对其进行限制。它 returns 一个 超大 缓冲区。
你好,我有一个关于 Proto 缓冲区的问题,我从在线游戏中嗅探数据包,它使用 Proto 缓冲区,所以我尝试了很多次通过 proto 缓冲区再次发送这个数据包,但我不能它没有给出任何动作,我让控制台应用程序得到结果,我发现结果我不完整,因为有长度和数据包编号并且 header 没有出现在结果中我可以发送数据包所以有办法发送 header 和带有原始缓冲区的数据包 ID 而不改变它们
这是我的代码:
[ProtoContract]
public class Person
{
//[ProtoMember(0)]
//public string Name { get; set; }
public ushort Length;
public uint PacketNumer;
[ProtoMember(1, IsRequired = true)]
public uint UID;
[ProtoMember(2, IsRequired = true)]
public uint X;
[ProtoMember(3, IsRequired = true)]
public uint Y;
[ProtoMember(4, IsRequired = true)]
public uint TimeStamp;
[ProtoMember(5, IsRequired = true)]
public uint JumpStyle;
[ProtoMember(6, IsRequired = true)]
public uint Direction;
[ProtoMember(7, IsRequired = true)]
public uint FromX;
[ProtoMember(8, IsRequired = true)]
public uint FromY;
[ProtoMember(9, IsRequired = true)]
public uint MapID;
}
static void Main(string[] args)
{
Person input = new Person
{
UID = 12786811,
X = 430,
Y = 405,
TimeStamp = (uint)Environment.TickCount,
JumpStyle = 137,
Direction = 1,
FromX = 427,
FromY = 410,
MapID = 1002
};
var stream = new MemoryStream();
Serializer.SerializeWithLengthPrefix(stream, input, PrefixStyle.Fixed32);
Console.WriteLine(BitConverter.ToString(stream.GetBuffer()));
Person result;
//object output;
result = Serializer.DeserializeWithLengthPrefix<Person>(stream, PrefixStyle.Base128);
Console.ReadLine();
}
我从游戏中嗅探到的数据包:
2F 00 1A 27 08 FB B8 8C 06 38 BC 03 40 FC 02 48 9B C4 BF 40 60 89 01 68 07 70 BB 03 78 FA 02 88 01 CF 0F A0 01 FF FF FF FF FF FF FF FF FF 01
这是 App 的结果:
1E-00-00-00-08-FB-B8-8C-06-10-AE-03-18-95-03-20-A0-AB-B3-41-28-89-01-30-01-38-AB-03-40-9A-03-48-CF-0F
我想发送数据包,就像我用 header 和偏移量 2 中的数据包 ID 嗅探的数据包>> 1A 27 有办法吗? 谢谢
这里的前缀显然不是fixed-32;它可能是 varint(base-128),所以第一个改变就是使用它。
现在,您提到了数据包编号和长度。如果这些不是合适的 protobuf 格式,那么简单:您可能需要手动编写 header。我知道 解码 public API 上的原始 varint,但我不记得是否有 编码的代码 一个 - 但是:它最终并不是很复杂。所以:最坏的情况,自己写前几个字节。
最后:永远不要使用 GetBuffer(),除非您要捕获 Length 并对其进行限制。它 returns 一个 超大 缓冲区。