首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Indy的TMemoryStream发送IdTrivialFTP?

如何使用Indy的TMemoryStream发送IdTrivialFTP?
EN

Stack Overflow用户
提问于 2009-12-29 21:38:59
回答 4查看 1.9K关注 0票数 0

我正在使用Delphi 2010和Indy 10,与之配套。MemStream是一个TMemoryStream,它包含一个从网站下载的文件。

代码语言:javascript
复制
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“中抛出的:

代码语言:javascript
复制
    CurrentDataBlk := WordToStr(GStack.HostToNetwork(Word(TFTP_DATA)))
+ WordToStr(GStack.HostToNetwork(BlockCtr));

为了清楚起见,下面是该代码的上下文:

代码语言:javascript
复制
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 }
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-01-04 22:45:05

D2010附带的Indy 10版本并不是最新的Indy 10修订版。您引用的被破坏的Indy代码在当前版本中不再存在。TIdTrivialFTP在一段时间前被重写,以修复许多问题(不过,当时我忘了检查它。)我现在已经这样做了。请从Indy的SVN服务器或Fulgan镜像下载最新的Indy 10快照(您需要等待一天才能赶上)。下载链接可在印第的网站上找到。

票数 1
EN

Stack Overflow用户

发布于 2009-12-29 22:20:21

很好地确定异常的来源。当你遇到异常时,这应该永远是你做的第一件事。

你用的印地代码坏了。即使没有范围检查错误,它也不会从源流发送任何数据。您可以自己看到读取流内容的行已被注释掉。它仍然在今天的开发快照中被注释掉,而且似乎已经有两年多没有人在这个文件上工作过了。事实上,自从文件被添加到版本7中的Subversion存储库后,这一行就被注释掉了。

抛弃TIdTrivialFTP,用成熟的FTP客户端来试试运气,TIdFTP

票数 3
EN

Stack Overflow用户

发布于 2009-12-29 22:00:48

你可以自己很容易地解决这个问题:

  • 在带有IdTrivialFTP1.Name的行上设置一个断点。
  • 点击F9运行你的应用程序。做任何触发代码FTP文件的事情。
  • 当IDE在断点上停止时,按F8逐行遍历代码。
  • 请注意您按F8并触发异常的行。这就是问题所在。

因为只有两行应该触发范围检查错误(分配端口和ReceiveTimeout的行),所以找出哪一行是罪魁祸首应该是+trivial+ (双关意)。我想可能是港口的问题。

另外,别忘了Indy提供了完整的源代码。如果您将项目的编译器选项设置为使用调试DCU,也可以追溯到这一点。(项目-选项-Compiler)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1977113

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档