Frage

Ich versuche, einen TFTP-Server zu erstellen, aber wenn er eine Datei empfängt, scheint nicht alles auf dem Server gespeichert zu sein (einige Bytes fehlen).Die Datei wird einwandfrei erstellt und der Großteil der Daten wird geschrieben, aber da die Datei nicht vollständig ist, wird sie als beschädigt und nicht öffenbar eingestuft.Weiß jemand, wie man dieses Problem behebt?

Hauptklasse

            WRQ WRQ = new WRQ();
            ACK ACK = new ACK();
            DatagramPacket outPacket;
            BufferedOutputStream bufferedOutput = new BufferedOutputStream(new FileOutputStream(filename));
            byte[] bytes;
            byte[] fileOut;
            outPacket = WRQ.firstPacket(packet);
            socket.send(outPacket);

            socket.receive(packet);

            while (packet.getLength() == 516){

            bytes = WRQ.doWRQ(packet);
            bufferedOutput.write(bytes);

            outPacket = ACK.doACK(packet);
            socket.send(outPacket);

            socket.receive(packet); 

            }

            bytes = WRQ.doWRQ(packet);
            bufferedOutput.write(bytes);

            bufferedOutput.close();

            outPacket = ACK.doACK(packet);
            socket.send(outPacket);

WRQ-Klasse

public class WRQ {

public DatagramPacket firstPacket(DatagramPacket packet) throws IOException{

    ACK ACK = new ACK();
    DatagramPacket ACKpacket = ACK.doACK(packet);

    //takes ACK packet and sets block # as 0 to signal that this is the first packet in a WRQ
    byte[] ACKcontents = new byte[3];
    ACKcontents = ACKpacket.getData();
    ACKcontents[2] = 0;
    ACKcontents[3] = 0;
    ACKpacket.setData(ACKcontents);

    return ACKpacket;

}

public byte[] doWRQ(DatagramPacket packet){

    int length = packet.getLength();
    byte[] packetData = packet.getData();
    byte[] data = new byte[length - 4];
    data = Arrays.copyOfRange(packetData, 4, length - 4);

    return data;

}

}
War es hilfreich?

Lösung

Dieser Code sieht für mich sehr verdächtig aus:

byte[] packetData = packet.getData();
byte[] data = new byte[length - 4];
data = Arrays.copyOfRange(packetData, 4, length - 4);

Ihr Ausgabearray (Daten) hat eine Länge length - 4, aber du kopierst nur length - 8 bytes dazu.Wenn die in packetData zu ignorierenden Bytes die ersten 4 Bytes sind, sollte es sein

data = Arrays.copyOfRange(packetData, 4, length);

weil das letzte Argument keine Länge ist, sondern die to index (exklusiv).Sehen das Javadoc Einzelheiten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top