Pregunta

El siguiente código está diseñado para tomar un byte[] y varias otras cosas (ver el código que se regala).A continuación, crea un paquete con una cierta longitud y devuelve este.Mi problema es que cuando he leído en un archivo en la carpeta principal del programa necesito el búfer para el datagrama paquete a ser el número de bytes de izquierda a enviar (si menos de 512) + 4.Esto es controlar el último paquete de una solicitud de lectura de un servidor TFTP.Im conseguir un índice fuera de los límites de la excepción en la línea de "buffer[bufferOffset] = datos[dataOffset];".Alguien me puede ayudar a entender por qué esto está sucediendo y cuál sería la mejor manera de evitarlo?

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;

}
¿Fue útil?

Solución

No veo donde alguna vez echar un vistazo a data.length. Es posible que los datos.la longitud es mayor que sentBytes?Si es así, el bucle debe estar por encima de sentBytes, no sobre los datos.

Básicamente, la lógica para decidir la longitud de búfer de búfer parece sospechosamente divorciado del tamaño de sentBytes.

Otros consejos

Este es el código rediseñados para una forma compacta:

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;
}

Ahora es bastante obvio lo que está pasando.Su expresión para el tamaño de búfer no dependen directamente de data.length, por lo que el problema puede estar en los valores de la argumentos para el método, tal como se puede mentir en el propio código.Sea usted el juez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top