为了账号安全,请及时绑定邮箱和手机立即绑定

通过 TFTP 传输的文件与主机上传输的文件大小不同

通过 TFTP 传输的文件与主机上传输的文件大小不同

拉莫斯之舞 2024-01-05 17:05:40
很长一段时间以来,我一直在努力在 Android 应用程序中处理 TFTP 协议。其主要功能是从托管 TFTP 服务器的定制设计设备下载文件。我正在浏览互联网,希望找到一些好的、已经编写好的实现。首先,我尝试使用 TFTP 库,它是 Apache Commons 的一部分。不幸的是没有运气 - 不断超时甚至完全冻结。经过进一步研究,我在 github 上找到了一些代码 -请看一下。我已经采用了 Android 代码,经过一些调整,我终于收到了一些文件。该设备的创建者表示,块大小应该正好是 1015 字节。所以我将包大小增加到1015并更新了创建读取请求包的方法:DatagramPacket createReadRequestPacket(String strFileName) {    byte[] filename = strFileName.getBytes();    byte[] mode = currentMode.getBytes();    int len = rOpCode.length + filename.length + mode.length + 2;    ByteArrayOutputStream outputStream = new ByteArrayOutputStream(len);    try {        outputStream.write(rOpCode);        outputStream.write(filename);        byte term = 0;        outputStream.write(term);        outputStream.write(mode); // "octet"        outputStream.write(term);        outputStream.write("blksize".getBytes());        outputStream.write(term);        outputStream.write("1015".getBytes());        outputStream.write(term);    } catch (IOException e) {        e.printStackTrace();    }    byte[] readPacketArray = outputStream.toByteArray();    return new DatagramPacket(readPacketArray, readPacketArray.length, serverAddr, port);}正在下载块,但有一个主要问题 - 我下载的文件是分成几部分的,每个部分 512kB(除了最后一个),而我在 Android 设备上收到的每个部分大约大 0.5kB。看起来好像每次多一个字节或者多一整个附加。显然我不完全理解它并且我错过了一些东西。
查看完整描述

1 回答

?
至尊宝的传说

TA贡献1789条经验 获得超10个赞

我知道出了什么问题。这种奇怪的行为是收到最后一个数据包时这一行的结果:

byte[] fileDataBytes = pktFactory.getDataBytes(dPkt);

返回的数组大小始终等于指定的数据包长度,即使接收到的数据较小。在我的例子中,最后一个数据包是 0 字节(tftp 为 +4 字节),但即便如此,额外的 512 字节还是添加到了输出流中。

为了解决这个问题,我使用额外的参数重载了提到的方法 - 当接收到的数据大小高于 4 字节且低于指定的数据包大小(512 字节)时,接收到的数据包的实际大小。此更改导致获得最后一个数据包的数组的正确大小,因此接收到的文件在操作结束时具有正确的大小。


查看完整回答
反对 回复 2024-01-05
  • 1 回答
  • 0 关注
  • 158 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信