【发布时间】:2022-01-10 07:00:31
【问题描述】:
我的主要目标是将 C# 客户端连接到 Minecraft 服务器,但我在获取服务器发送的数据包内容时遇到了一些麻烦。根据this page,Minecraft 中的数据包应该匹配特定的格式。 (Format of a packet)
另外,根据this,字符串的前缀是长度。
这是the packet,我正在尝试获取。
知道这些信息,这是我的代码:
//S->C : Login Success
int packet_Length = ReadVarInt(stream);
int packet_Id = ReadVarInt(stream);
int uuid_length = ReadVarInt(stream);
string uuid = ReadString(stream, 16);
int name_length = ReadVarInt(stream);
string name = ReadString(stream, 16);
public static int ReadVarInt(Stream stream)
{
int value = 0;
int length = 0;
int currentByte;
while (true)
{
currentByte = stream.ReadByte();
value |= (currentByte & 0x7F) << (length++ * 7);
if (length > 5) throw new IOException("VarInt too big");
if ((currentByte & 0x80) != 0x80) break;
}
return value;
}
public static string ReadString(Stream stream, int length)
{
byte[] data = new byte[length];
stream.Read(data);
return Encoding.UTF8.GetString(data);
}
结果:
packet_Length : 3
packet_Id : 3
uuid : ↓☻►v9Q?►1??w??
name : 9♠mc_bot
问题是数据包ID应该是1,uuid是常规字符串,name只有“mc_bot ”作为值。我准确地说,必须在完美工作之前完成的部分(我认为)因为客户端在获得 Login Success 数据包后加入服务器,但我无法正确获取任何数据。
谢谢!
【问题讨论】:
-
一个 UUID 是 32 个字符长度或 36 个
- -
好的,这很酷!如果你修复它,你可以自我回答分享你如何修复它:)
-
我误删了我之前的帖子...感谢您让我走上正确的道路!
-
没问题,很高兴!还有,没关系,评论不是很重要
标签: c# parsing tcp minecraft packet