gpt4 book ai didi

c++ - 与 minecraft bukkit 服务器握手 - 发送服务器主机字段失败

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:51:37 24 4
gpt4 key购买 nike

我正在尝试为我的世界服务器制作客户端/机器人来自动保护聊天并禁止垃圾邮件发送者。 (第一个成就)
我在这里找到了一些文档并且实现了数据类型 from here (so they look like this - 我还没说完)。现在,我正在尝试发送初始 0x02 数据包,它应该如下所示:

我的数据包格式

size    value                comment

1 0x02 Packet ID
2+? string Username (I send "jakub")
2+? another string Server host name - here, the program FAILS*
4 25565 Port number

*Fails表示bukkit server在console输出如下,socket关闭:

11:09:45 [INFO] /127.0.0.1:51256 lost connection

我现在明白了,如何测试我的数据类型是否正确,但是因为我发送用户名似乎没有问题,我想我发送的是错误信息,虽然在正确的格式

生成字符串

但无论如何,我很好奇我是否做对了一切。我有 mc_shortmc_string 类。这就是 mc_short 如何创建其自身的 2 个字节:

//mc_short::val is type of short 
void mc_short::asBytes(char* data) {
for (int i = 0; i < 2; i++)
data[endianity?i:1-i] = (val >> (i * 8)); //Some magic with byteshifting.
//endianity is set to false, because java uses BigEndian everywhere** (UNFRIENDLY PERSONS!!)
}

**引用http://wiki.vg/Data_Types :

All types in Java (and as such Minecraft) are big-endian, that is, the most significant byte comes first.

然后字符串本身使用mc_shortstd::string 来填充char* 中的字节。

void mc_string::asBytes(char* data) {
mc_short size((short)val.length()); //val is std::string
size.endianity = endianity; //mc_string::endianity is boolean, and is ony used to determine endianity of the first 2 bytes
size.asBytes(data); //Filling 2 bytes in data - length info
for(short i=0; i<size.value(); i++) {
data[i+2] = val[i]; //Copying std::string to data
}
}

问题总结

  1. 我应该发送什么作为“服务器主机名”,即 0x02 的第三个字段?
  2. 我发送的字符串是否正确?不需要任何其他转换吗?

我知道,我的问题是关于不太为人所知的话题,因此您可能不知道答案,也不知道话题本身。在这种情况下忽略这个问题。

最佳答案

字符串以大端 unicode(UTF-16,但大端)编码。如果您不使用 Java,则不能直接从内存映射您的角色(好吧,如果您只是在每个字符之间写一个零并接受这是一种糟糕的做法,您就可以作弊)。在 C# 中有一个编码 Minecraft 字符串的示例 here .

至于该字符串的内容,应该是要连接的主机名。如果 Google 运行 Minecraft 服务器,则该字符串可能是 minecraft.google.com

使用这个实际数据包的一个例子是 here .

因此,在您的问题得到实际回答后,我提供了一些建议。 Minecraft 协议(protocol)很糟糕,编写客户端需要大量工作。您需要能够支持协议(protocol)中的所有数据包(是的,所有数据包),并且您需要实现基本物理以使其掉落到地面上,这样您就不会被踢飞。有几种选择,从最好到最差的选择:

  • 使用 Bukkit 并为此编写一个插件
  • 写一个代理而不是客户端
  • 写一个客户端,就像你现在正在尝试的那样

因此,如果您首先执行此操作,则需要用 Java 编写一个插件。我对此了解不多。

我对后两个选项了解很多。我是 Craft.Net 的维护者,这是一堆库,包括通用网络库和客户端库。您可以在几个小时内将客户端或代理放在一起。一个示例客户端在同一个 repo 中,并且有一个代理 here .这些都使用 C#。

如果您仍然想完全自己动手,祝您好运,一切顺利。

关于c++ - 与 minecraft bukkit 服务器握手 - 发送服务器主机字段失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15448286/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com