与minecraft bukkit服务器握手-发送服务器主机字段失败
handshake with the minecraft bukkit server - failed sending server host field
我正试图使客户端/机器人为我的世界服务器自动保护聊天和禁止垃圾邮件发送者。(第一个成果)
我在这里找到了一些文档,并从这里实现了数据类型(所以它们看起来像这样-我还没有完成)。现在,我尝试发送初始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服务器在控制台中输出如下内容,并且套接字已关闭:
11:09:45 [信息]/127.0.0.1:51256 失去联系
我现在可以看到的方式,如何测试如果我的数据类型是正确的,但因为我似乎发送用户名没有问题,我认为我发送错误的信息,虽然在正确的格式。
生成字符串但无论如何,我很好奇我是否做对了每件事。我有mc_short
和mc_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:
Java中的所有类型(Minecraft也是如此)都是大端序的,也就是说,最重要的字节在前面。
然后字符串本身使用mc_short
和std::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
}
}
问题总结- 我应该发送什么作为"服务器主机名",第三个字段0x02?
- 我发送的字符串正确吗?难道不需要其他的转换吗?
字符串以大端字节编码(UTF-16,但大端字节)。如果你不使用Java,你就不能直接从内存中映射字符(如果你只是在每个字符之间写一个0,你可以作弊,接受这是一种糟糕的方法)。这里有一个c#编码Minecraft字符串的例子。
对于该字符串的内容,它应该是要连接的主机名。如果Google运行Minecraft服务器,该字符串可能是minecraft.google.com
。
使用这个实际数据包的示例如下:
那么,你的问题得到了实际回答,一些建议。《我的世界》协议很糟糕,编写客户端需要大量的工作。您需要能够支持协议中的所有数据包(是的,所有数据包),并且您需要实现基本的物理功能以使您能够落地,这样您就不会因为飞行而被踢到。这里有几个选项,按照从好到坏的顺序排列:
- 用Bukkit写一个插件
- 写代理而不是客户端
- 编写一个客户端,就像你现在正在尝试一样
所以,如果你做了第一个,你需要用Java写一个插件。我对这个了解不多。
后两个选项我确实知道很多。我是Craft的维护者。Net是一堆库,包括一个通用的网络库和一个客户端库。你可以在几个小时内拼凑出一个客户端或代理。一个示例客户端在同一个回购中,这里有一个代理。这些都使用c#。
如果你还想完全自己滚,祝你好运,祝你一切顺利。
- "unknown ca"自生成的 CA、证书和客户端/服务器
- 当我编译webrtc服务器时,Windows上只支持clang-cl
- Cuda C++:设备上的Malloc类,并用来自主机的数据填充它
- EvtExportLogneneneba API正在将远程计算机的事件日志保存到远程PC本身.如何将其保存到主机
- 如何通过套接字将文本文件的内容从服务器发送到客户端
- 有没有办法知道Tracer是否成功地完全连接到了jaegerclientcpp中的jaeger后端服务器
- 从服务器传输到客户端的消息不会出现
- QTcpSocket在不阻塞GUI的情况下重新连接到服务器
- OpenSSL TLS服务器-使用客户端证书白名单
- 我正在开发服务器,ip作为参数传递不起作用
- 电子邮件地址中的c++smtp服务器主机名
- 从主机向在VirtualBox linux机器上运行的服务器发送http请求
- 无法将主机名"localhost"转换为地址:未知服务器错误
- 从服务器端C++套接字主机名
- 如何在一台本地计算机/主机上对简单的 TCP 客户端/服务器进行单元测试
- 如何获取服务器的主机名
- 通过编程方式获取主机的DNS IPv6服务器
- 如何从客户端访问服务器主机名中知道客户端访问服务器FQDN
- 与minecraft bukkit服务器握手-发送服务器主机字段失败
- 如何配置xmlrpc-c深渊服务器主机