Question

J'ai essayer de créer un serveur TFTP, mais lorsqu'il reçoit un fichier, il semble que pas tous, il est enregistré sur le serveur (quelques octets sont manquantes).Le fichier est créé fine et la majorité des données est écrit, mais que le dossier n'est pas complet, il est considéré comme corrompu et unopenable.Quelqu'un sait-il comment résoudre ce problème?

classe principale

            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 classe

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;

}

}
Était-ce utile?

La solution

Ce code semble très suspect pour moi:

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

Votre tableau de sortie (données) est de longueur length - 4, mais vous vous contentez de copier length - 8 octets pour elle.Si les octets à ignorer dans packetData sont les 4 premiers octets, il devrait être

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

parce que le dernier argument n'est pas une longueur, mais le to index (exclusif).Voir la javadoc pour plus de détails.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top