我正在使用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;每当我运行这段代码时,我都会得到以下错误:
Project TestProject.exe引发带有消息“范围检查错误”的异常类ERangeError。
我已经做了相当多的谷歌,以了解这个错误,但我目前在一个困惑。我还看到只有一个如何执行TFTP PUT的示例使用Indy组件。
有什么想法吗?
UPDATE: --如果我对错误进行了一点跟踪,就会发现该错误是从第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 }发布于 2010-01-04 22:45:05
D2010附带的Indy 10版本并不是最新的Indy 10修订版。您引用的被破坏的Indy代码在当前版本中不再存在。TIdTrivialFTP在一段时间前被重写,以修复许多问题(不过,当时我忘了检查它。)我现在已经这样做了。请从Indy的SVN服务器或Fulgan镜像下载最新的Indy 10快照(您需要等待一天才能赶上)。下载链接可在印第的网站上找到。
发布于 2009-12-29 22:20:21
很好地确定异常的来源。当你遇到异常时,这应该永远是你做的第一件事。
你用的印地代码坏了。即使没有范围检查错误,它也不会从源流发送任何数据。您可以自己看到读取流内容的行已被注释掉。它仍然在今天的开发快照中被注释掉,而且似乎已经有两年多没有人在这个文件上工作过了。事实上,自从文件被添加到版本7中的Subversion存储库后,这一行就被注释掉了。
抛弃TIdTrivialFTP,用成熟的FTP客户端来试试运气,TIdFTP。
发布于 2009-12-29 22:00:48
你可以自己很容易地解决这个问题:
因为只有两行应该触发范围检查错误(分配端口和ReceiveTimeout的行),所以找出哪一行是罪魁祸首应该是+trivial+ (双关意)。我想可能是港口的问题。
另外,别忘了Indy提供了完整的源代码。如果您将项目的编译器选项设置为使用调试DCU,也可以追溯到这一点。(项目-选项-Compiler)
https://stackoverflow.com/questions/1977113
复制相似问题