문제

아래 코드는 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;

}
도움이 되었습니까?

해결책

네가 어디를 보는지 모르겠어 data.length. data.length가 sentBytes보다 클 가능성이 있습니까?그렇다면 루프는 데이터가 아닌 sentBytes를 초과해야 합니다.

기본적으로 버퍼의 버퍼 길이를 결정하는 논리는 sentBytes의 크기와 의심스럽게 이혼한 것 같습니다.

다른 팁

다음은 간결한 형식으로 리팩터링된 코드입니다.

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, 따라서 문제는 인수 코드 자체에 있을 수 있는 것처럼 메서드에도 적용됩니다.당신이 판사가 되십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top