我正在使用它附带的 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,并带有消息“范围检查错误”。
我一直在做很多谷歌搜索来理解这个错误,但我目前不知所措。我也只看到了一个如何使用 Indy 组件执行 TFTP PUT 的示例。
有任何想法吗?
更新: 如果我稍微追踪一下错误,我发现错误是从第 272 行的“IdTrivialFTP.pas”中抛出的:
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 }