【发布时间】:2019-03-26 12:00:55
【问题描述】:
我正在使用自己使用的远程管理工具,项目已停止,因为服务器端的接收器功能出错。:
算术运算导致溢出。 (添加整数)
在这一行:
var imageData = new byte[length];
void server_Received(Listener l, Info i, string received) {
string[] cmd = received.Split('|');
switch (cmd[1])
{
case "PRINT":
//MessageBox.Show("print");
Thread threadPrint;
threadPrint = new Thread(() =>
{
var lengthData = new byte[4];
var lengthBytesRead = 0;
while (lengthBytesRead < lengthData.Length)
{
var read = i.sock.Receive(lengthData, lengthBytesRead, lengthData.Length - lengthBytesRead, SocketFlags.None);
if (read == 0) return;
lengthBytesRead += read;
}
var length = BitConverter.ToInt32(lengthData, 0);
var imageData = new byte[length];
var imageBytesRead = 0;
while (imageBytesRead < imageData.Length)
{
var read = i.sock.Receive(imageData, imageBytesRead, imageData.Length - imageBytesRead, SocketFlags.None);
if (read == 0) return;
imageBytesRead += read;
}
using (var stream = new MemoryStream(imageData))
{
var bitmap = new Bitmap(stream);
Invoke(new ImageCompleteDelegate(ImageComplete), new object[] { bitmap });
}
});
threadPrint.Start();
break;
}
}
我从this 参考中获取的接收器代码(请参阅客户端代码)并根据我的需要进行了调整,如您在上面看到的那样。
这是我在 android (Java) 上发送位图的方式:
try {
dos = new DataOutputStream(SocketBackgroundService.xclientSocket.getOutputStream());
PrintWriter out = new PrintWriter(
new BufferedWriter(
new OutputStreamWriter(dos)
)
);
out.println("|PRINT|");
out.flush();
dos.writeInt(array.length);
dos.write(array, 0, array.length);
dos.flush();
} catch (IOException e) {
e.printStackTrace();
}
那么,我想知道有什么办法可以解决这个问题?
提前致谢。
【问题讨论】:
-
你不能创建一个负长度的数组(这似乎是你得到的例外)。因此,您获取长度并将其转换为 int 的方式是问题所在。由于您传入的图像的大小,您得到了否定。我首先建议尝试使用较小的位图,看看它是否适用于您保证长度小于 2^32 的东西。我不知道如何在不使用更多数组的情况下解决这个问题。基本上是一个字节数组列表,每个字节数组都保存图像数据,然后用一个由图像数据列表组成的内存流更新一个位图。
-
@DubDub,感谢您的建议,但任何尺寸的图像(位图)都会出现错误。
-
没问题,这个Info类你指的是参数,你能编辑一下吗?或者提供指向它的文档的链接。我很好奇你是如何设置套接字的。
-
@DubDub,你可以找到我最近的另一个question
-
@DubDub,我测试了你的建议
"change 'lengthData.Length - lengthBytesRead' to 'lengthBytesRead' ",上面的异常已经解决了,但还是不行(无法接收位图)。尽管如此,还是谢谢你。
标签: c# android sockets visual-studio-2013