Domanda

Il seguente codice è progettato per prendere un byte [] e molte altre cose (vedere il codice che lo dà via).Quindi costruisce un pacchetto con una certa lunghezza e restituisce questo.Il mio problema è quando ho letto in un file nel programma principale, ho bisogno del buffer per il pacchetto Datagram per essere il numero di byte da sinistra da inviare (se inferiore a 512) + 4. Questo è quello di gestire l'ultimo pacchetto di una richiesta di letturadi un server TFTP.Sto ottenendo un indice fuoriuscita dall'eccezione dei limiti sulla linea "buffer [bufferoffset]= dati [dataoffset];".Qualcuno può aiutarmi a capire perché questo sta accadendo e quale sarebbe il modo migliore intorno ad esso?

public DatagramPacket doRRQ(byte[] data, int block, InetAddress address, int port, long fileSize, long sentBytes){

//takes file data and creates a buffer for a DATA packet to be used in a RRQ. This packet 
//is passed to MyFirstTFTPServer.java to be modified and sent to client. This is done 
int bufferOffset = 3;
int dataOffset = -1;
byte[] buffer = null;
long difference = 0;
int i = 512;
byte byteBlock = (byte)block++;//possible issue with block no increment. test.

if (sentBytes + 512 > fileSize){

difference = fileSize - sentBytes;
    difference = difference + 4;
    i = (int)difference;
    buffer = new byte[i];

} else {

    buffer = new byte[516];

}

DatagramPacket packet = new DatagramPacket(buffer, buffer.length, address, port);
buffer[0] = 0;
buffer[1] = 3;
buffer[2] = 0;
buffer[3] = byteBlock;
for(byte item:data){

    bufferOffset++;
    dataOffset++;
    buffer[bufferOffset] = data[dataOffset];

    //System.out.println(bufferOffset);

    //System.out.println(dataOffset);

}

return packet;

}
.

È stato utile?

Soluzione

Non vedo dove hai mai dato un'occhiata a data.length. è possibile che i dati.Lunghezza sia maggiore di Sentbyte?Se è così, il tuo loop dovrebbe essere su Sentbytes, non oltre i dati.

Fondamentalmente, la tua logica per decidere la lunghezza del buffer del buffer sembra sospettosamente divorziata dalle dimensioni di Sentbytes.

Altri suggerimenti

Questo è il tuo codice refattore a una forma compatta:

public DatagramPacket doRRQ(byte[] data, int block, InetAddress address,
    int port, long fileSize, long sentBytes)
{
  final byte[] buffer =
    new byte[sentBytes + 512 > fileSize? (int)(fileSize - sentBytes) + 4 : 516];
  final DatagramPacket packet = 
    new DatagramPacket(buffer, buffer.length, address, port);
  buffer[1] = 3;
  buffer[3] = (byte)block;
  for (int i = 0; i < data.length; i++) buffer[i+3] = data[i];
  return packet;
}
.

Ora è abbastanza ovvio cosa sta succedendo.La tua espressione per la dimensione del buffer non dipende direttamente da data.length, quindi il problema può mentire nei valori degli argomenti al metodo, proprio come può mentire nel codice stesso.Sei il giudice.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top