Я использую Delphi 2010 и Indy 10, которые поставляются с ним. MemStream представляет собой TMemoryStream и содержит файл, загруженный с веб-сайта.
IdTrivialFTP1 := TIdTrivialFTP.Create(nil);
try
IdTrivialFtp1.Name := 'IdTrivialFTP1';
IdTrivialFTP1.Host := 'my-tftp-server-name.contoso.com';
IdTrivialFTP1.Port := 69;
IdTrivialFTP1.ReceiveTimeout := 4000;
MemStream.Position := 0;
IdTrivialFTP1.Put(MemStream, sFileName);
finally
FreeAndNil(IdTrivialFTP1);
end;
Всякий раз, когда я запускаю этот код, я получаю сообщение об ошибке:
Проект TestProject.exe вызвал класс исключения ERangeError с сообщением «Ошибка проверки диапазона».
Я немного погуглил, чтобы понять эту ошибку, но сейчас я в недоумении. Я также видел только 1 пример выполнения TFTP PUT с использованием компонентов Indy. .
Любые идеи?
ОБНОВЛЕНИЕ: если немного проследить ошибку, я обнаружу, что ошибка возникает из "IdTrivialFTP.pas" в строке 272:
CurrentDataBlk := WordToStr(GStack.HostToNetwork(Word(TFTP_DATA)))
+ WordToStr(GStack.HostToNetwork(BlockCtr));
Для ясности вот контекст этого кода:
if BlockCtr > PrevBlockCtr then
begin
DataLen := IndyMin(BufferSize - hdrsize, SourceStream.Size - SourceStream.Position);
SetLength(CurrentDataBlk, DataLen + hdrsize);
CurrentDataBlk := WordToStr(GStack.HostToNetwork(Word(TFTP_DATA))) + WordToStr(GStack.HostToNetwork(BlockCtr));
SetLength(CurrentDataBlk, DataLen + hdrsize);
//SourceStream.ReadBuffer(CurrentDataBlk[hdrsize+1], DataLen);
DoWork(wmWrite, DataLen);
TerminateTransfer := DataLen < BufferSize - hdrsize;
PrevBlockCtr := BlockCtr;
end;
Send(FPeerIP, FPeerPort, CurrentDataBlk);
until False; { repeat }
SourceStream.ReadBuffer
все еще закомментирована. 05.01.2010