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

C++ 与minecraft bukkit服务器握手-发送服务器主机字段失败,c++,minecraft,packets,C++,Minecraft,Packets,我正在尝试为minecraft服务器制作客户端/机器人,以自动保护聊天和禁止垃圾邮件发送者。(第一个成就) 我在这里找到了一些文档,并且已经实现了数据类型(-我还没有完成)。现在,我正在尝试发送inital0x02数据包,它应该如下所示: 我的数据包格式 *失败表示bukkit服务器在控制台中输出以下内容,并且套接字关闭: 11:09:45[信息]/127.0.0.1:51256断开连接 我现在知道了如何测试我的数据类型是否正确,但因为我发送用户名似乎没有问题,我认为我发送了错误的信息,尽管格式

我正在尝试为minecraft服务器制作客户端/机器人,以自动保护聊天和禁止垃圾邮件发送者。(第一个成就)
我在这里找到了一些文档,并且已经实现了数据类型(-我还没有完成)。现在,我正在尝试发送inital
0x02
数据包,它应该如下所示:

我的数据包格式 *失败表示bukkit服务器在控制台中输出以下内容,并且套接字关闭:

11:09:45[信息]/127.0.0.1:51256断开连接

我现在知道了如何测试我的数据类型是否正确,但因为我发送用户名似乎没有问题,我认为我发送了错误的信息,尽管格式正确

生成字符串 但不管怎样,我很好奇我是否做对了每件事。我有
mc\u short
mc\u 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!!)
}
问题摘要
  • 我应该发送什么作为“服务器主机名”,0x02的第三个字段
  • 我发送的字符串正确吗?是否需要进行其他转换

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

    字符串是用big-endian unicode(UTF-16,但不是big-endian)编码的。如果不使用Java,就无法直接从内存映射字符(如果只在每个字符之间写一个零,并接受这是一种糟糕的方式,则可能会作弊)。C#中有一个对Minecraft字符串进行编码的示例

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

    使用此实际数据包的示例如下

    所以,随着你的问题得到了回答,一些建议。Minecraft协议非常糟糕,编写客户端需要大量工作。您需要能够支持协议中的所有数据包(是的,所有数据包),并且您需要实现基本物理,以使您不会因为飞行而被踢到地面。有几种选择,从最佳到最差依次为:

    • 使用Bukkit并为此编写插件
    • 编写代理而不是客户端
    • 写一个客户,就像你现在想做的那样
    因此,如果你做第一件事,你需要用Java编写一个插件。我对此不太了解

    关于后两种选择,我确实知道很多。我是的维护者,它是一组库,包括一个通用网络库和一个客户端库。您可以在几个小时内创建一个客户端或代理。一个示例客户端位于同一回购协议中,并且有一个代理。这些都使用C#


    如果你还想完全实现自己的梦想,祝你好运,万事如意。

    你好,谢谢你的回答!:)我知道Craft.Net,但由于两个原因,我还没有在这里使用任何东西。首先,我总是有问题,包括如何使用新的库;其次,除非我完全迷路了,否则我喜欢自己解决问题。我不打算将我的bot实现为一个Bukkit插件,因为它还应该具有其他功能,而且我不喜欢java。如果我迷路了,有没有办法和你联系?(#可能是mcdevs IRC?我发誓只有在没有其他选择时我才会打扰你。除此之外,我已经让机器人使用
    0x07
    forcefield并实现了简单的资源清册操作。到目前为止,我糟糕的字符串没有给我带来任何问题:P我现在已经准备好编写映射解析器了。我在Freenode IRC上的#craft.net上闲逛。欢迎使用打扰一下,我不介意,我是SirCmpwn。
    //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!!)
    }
    
    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
        }
    }