C++ 当我用boost::asio向Minecraft客户端发送创建的数据包时,出现了一些问题

C++ 当我用boost::asio向Minecraft客户端发送创建的数据包时,出现了一些问题,c++,networking,boost-asio,network-protocols,bytebuffer,C++,Networking,Boost Asio,Network Protocols,Bytebuffer,目标和关于Notchian通信协议的指示 我有一个服务器应用程序,它使用boost::asio的异步读/写功能与连接的Notchian客户机进行通信。到目前为止,我读的很好,只写了一篇。在Minecraft中,您可以在每个Notchian服务器上获得这些数据包。这些数据包使用特定的数据包。我的服务器正在向客户端发送一个字符串作为Json响应 代码部分|我是如何编写ByteBuffer的 typedef无符号字符字节;/*发送无符号字节*/ LBuffer类{ std::载体buf; 公众: st

目标关于Notchian通信协议的指示

我有一个服务器应用程序,它使用boost::asio的异步读/写功能与连接的Notchian客户机进行通信。到目前为止,我读的很好,只写了一篇。在Minecraft中,您可以在每个Notchian服务器上获得这些数据包。这些数据包使用特定的数据包。我的服务器正在向客户端发送一个字符串作为Json响应

代码部分|我是如何编写ByteBuffer的

typedef无符号字符字节;/*发送无符号字节*/
LBuffer类{
std::载体buf;
公众:
std::vector&getBuf(){
返回buf;
}
无效写入(字节数据){
buf.推回(数据);
}
无效写入(int32_t数据){
buf.向后推(数据>>24);
buf.推回((数据>24);
buf.推回((数据>24);
buf.推回((数据>24);
}
void writeString(标准::字符串数据){
std::copy(data.begin()、data.end()、std::back_inserter(buf));
}
};
代码部分|如何将数据包写入缓冲区

LBuffer createHandshakeStatusResponsePacket(){
缓冲区;
缓冲区写入(0x00);
buffer.writeString(“{{version\”:{“name\”:“1.8.7\”,“protocol\”:47},“'players\”:{“max\”:100,“'online\”:5,“'sample\”:[{“name\”:“thinkofdeath\”,“id\”:“4566e69f-c907-48ee-8d71-d7ba5aa00d20\”,“description\”:{“text\”:“Helloworld\”);
返回缓冲区;
}
代码部分|使用ResponseBuf编写服务器

intmain(){
boost::asio::io_服务svc;
tcp::接受器a(svc);
a、 打开(tcp::v4());
a、 设置_选项(tcp::acceptor::重用_地址(true));
a、 绑定({},6767});
a、 听(5);
使用session=std::shared\u ptr;
std::函数doAccept;
功能剂量;
doSession=[&](会话s){
自动buf=std::使_共享(1024);
异步读取(boost::asio::buffer(*buf),[&,s,buf](错误代码ec,大小字节){
国际单项体育联合会(欧共体)

请注意,根据ASCII字符123是{(即左大括号字符)。我猜服务器正在将您在JSON字符串开头发送的花括号解释为数据包ID的一部分。@JeremyFriesner这真的很有帮助!但现在我正在考虑如何解决这个问题。我正在查看wiki.vg页面!最终我可以找到解决该问题的任何方法。我建议捕获一个“已知良好”的数据包(通过WireShark或类似方式,或通过将已知的工作客户端指向服务器,该服务器已被检测以打印出其接收的数据包的十六进制转储);然后眼球将已知良好数据包的字节与您的程序正在发送的数据包的字节进行比较。如果数据包不同(尤其是前几个字节),那么您的程序的数据包可能是错误的,而已知良好的数据包是正确的。@JeremyFriesner我捕获了已知良好的数据包,但它没有捕获我对Notchian客户端的响应。我将tcp端口筛选为25565。那么,我如何才能最合适地比较它?让您的程序在发送数据包时打印出数据包的字节:
,以便(尺寸j=0;j