我在使用Java的Android上有一个客户端应用程序,在Unity游戏中我的笔记本电脑上有一个服务器。两者都在同一网络上,我让它们连接起来。但是,当我从客户端向服务器发送小字符串消息时,服务器会使用以下警告阻止它:
ReadMessageBlocking: possible allocation attack with a header of 1298494342 bytes.
我什至应该开始走近这一障碍?
对于服务器,我正在使用Unity的Mirror库,该库建立在Telepathy框架之上。 对于客户,我遵循了this教程的客户部分。
This(来自Telepathy)包含引发此警告的相关方法(ReadMessageBlocking
)。我尝试将MaxMessageSize
设置为int.MaxValue
(约2 GB),以便至少接受该消息,以便我可以通过打印其内容来检查它,但无济于事。
我对ReadMessageBlocking
没问题,这是有充分理由的。我担心的是:为什么世界上我的android会发送带有字符串的1 GB标头?我该怎么办?
编辑:这是从客户端发送消息的相关功能(如前面提到的教程中所述。)
void sendMessage(final String message) {
new Thread(new Runnable() {
@Override
public void run() {
try {
if (null != socket) {
PrintWriter out = new PrintWriter(new BufferedWriter(
new OutputStreamWriter(socket.getOutputStream())),
true);
out.println(message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}
对于(Unity)服务器要接收,我什么也没写。警告来自Telepathy的内部消息处理功能,我认为这里是ReceiveLoop。
答案 0 :(得分:0)
您发送的包的标头不正确,表示标头中的包很大,服务器随后检测到原因,它希望防止发送标头的多个包超载,原因是该包比实际包头大得多
让标题为合适的大小
我尝试将MaxMessageSize设置为int.MaxValue
太大了
答案 1 :(得分:0)
我知道了。心灵感应(以及扩展名,镜像)使用byte[]
数组与常规格式为<size,message>
的数据包进行通信。这就是说,首先要在数组中指定要发送的消息的大小(以字节为单位),然后是实际消息内容的字节。
由于我在另一端使用Java,DataOutputStream
使其变得更简单:
DataOutputStream d_out = new DataOutputStream(socket.getOutputStream());
byte [] byte_message = message.getBytes();
d_out.writeInt(byte_message.length);
d_out.write(byte_message);
由于我之前没有使用DataOutputStream
,因此Telepathy将完整的消息内容解释为size
并在哭泣。因此完整的Send
代码现在看起来像这样:
void sendMessage(final String message) {
new Thread(new Runnable() {
@Override
public void run() {
try {
if (null != socket) {
DataOutputStream d_out = new
DataOutputStream(socket.getOutputStream());
byte [] byte_message = message.getBytes();
d_out.writeInt(byte_message.length);
d_out.write(byte_message);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
}