1

以下のコードは、byte []と他のいくつかのものを取得するように設計されています(それが与えるコードを参照してください)。次に、特定の長さのパケットを作成し、これを返します。私の問題は、メインプログラムにファイルを読み込むときに、データグラムパケットのバッファが送信される残りのバイト数(512未満の場合)+4である必要があることです。これは読み取り要求の最後のパケットを処理するためです。 TFTPサーバーの。「buffer[bufferOffset]=data[dataOffset];」の行でインデックスの範囲外の例外を取得しています。誰かが私がこれが起こっている理由とそれを回避するための最良の方法を理解するのを手伝ってもらえますか?

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;

}
4

2 に答える 2

2

どこを見たことがないのかわかりません data.length. data.lengthがsentBytesより大きい可能性はありますか?その場合、ループはデータではなく、sentBytesを超える必要があります。

基本的に、バッファのバッファ長を決定するロジックは、sentBytesのサイズから疑わしいほど離れているようです。

于 2012-05-22T20:34:42.373 に答える
1

これは、コンパクトな形式にリファクタリングされたコードです。

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

今、何が起こっているのかは非常に明白です。バッファサイズの式はに直接依存しないため、問題は、コード自体にあるのと同じように、メソッドの引数data.lengthの値にある可能性があります。あなたは裁判官です。

于 2012-05-22T20:52:28.733 に答える