TFTP客户端无法识别何时发送了最后一个数据包

时间:2016-03-07 12:34:50

标签: java macos networking network-programming tftp

我使用mac TFTP客户端来使用我的TFTP Java服务器。

无论客户端请求什么(在这种情况下是txt文件)都会被读取并重写。但是我遇到了一个问题,即客户端似乎没有发现最后一个数据包已被发送,在这种情况下会话应由TFTP客户端关闭(至少,据我所知) 。

这是读取所请求文件并检查数据包是否小于512字节的通用代码库,在这种情况下,它应该是最后一个数据包,客户端应该关闭会话。相反,客户端继续运行,直到传输时间超时。

int length = fileInputStream.read(buf);

    ByteBuffer wrap = ByteBuffer.allocate(BUFSIZE);
    wrap.putShort((short) OP_DAT);
    wrap.putShort((short) blockNumber );
    wrap.put(buf);


    DatagramPacket data = new DatagramPacket(wrap.array(), wrap.array().length);

    sendSocket.send(data);
    byte[] rec = new byte[BUFSIZE];

    DatagramPacket receivePacket = new DatagramPacket(rec, rec.length);
    sendSocket.receive(receivePacket);
    short comp = getAcknowledgment(receivePacket);

    if(comp == (short) blockNumber){
        System.out.println("Length of sent packet: " + length);
        return length < 512;
    }
    return true;

如果有人在MAC OS X上使用TFTP客户端有任何经验,我将非常感谢任何建议。

1 个答案:

答案 0 :(得分:0)

实际上,最后一个数据包应该正好是512字节而不是更少。检查它是否是最后一个包,然后执行此操作;

DatagramPacket data = new DatagramPacket(wrap.array(),512);

我认为这个解决了你的问题。