indy的ftp控件idftp也有bug

公司里有一个服务使用ftp方式做数据传输,于是在服务程序中使用indy的ftp控件做数据传输,一段时间的运行发现在传输过程中由于某种不知道原因情况下的网络掉线会导致程序会死翘翘,仔细分析了程序的逻辑,没有发现问题,根据记录下的日志文件,发现死翘翘前在做ftp文件传输处理,但是对其的try except end异常保护块没有记录下异常,遂开始怀疑使用的idftp控件问题,因为以前使用idTCPClient的时侯也碰到过问题。

使用google搜索关键字idftp bug 发现 http://groups.google.com.hk/group/borland.public.delphi.internet.winsock/browse_thread/thread/7b65058aa344137f/070b497000a0ea46?fwc=1 有讲到这个问题,是由于idftp在数据端口传输数据时忘记了设置连接的ReadTimeout 属性值造成。

原文作者在 interalGet函数中打了一下补丁,不过分析了一下,发现原文作者只打了interalGet中的主动传输方式部分代码,被动(passive)传输方式以及interalPut函数中也存在同样问题的代码没有打补丁。
仔细看了一下代码,发现只要给InitDataChannel函数打下补丁就可,他在interalGet和interalPut函数中的主被动方式中都有使用。

  1. procedure TIdFTP.InitDataChannel;
  2. begin
  3.   FDataChannel.SendBufferSize := SendBufferSize;
  4.   FDataChannel.RecvBufferSize := RecvBufferSize;
  5.   FDataChannel.OnWork := OnWork;
  6.   FDataChannel.OnWorkBegin := OnWorkBegin;
  7.   FDataChannel.OnWorkEnd := OnWorkEnd;
  8.  
  9.   // 添加的代码行 added line to fix the readtimeout bug
  10.   FDataChannel.ReadTimeout := Self.ReadTimeOut;
  11. end;

———–
到此程序的分析修改就告一段落了,接下来就要让程序24×7不停的运行,以观察看是否还是否有类似问题发生了。

Popularity: 7% [?]

Related

Comments

3 Responses to “indy的ftp控件idftp也有bug”

  1. Baal on July 12th, 2009 1:34 pm

    你好,同为sp开发人员。希望和你认识,多交流。
    qq:23372466

    [Reply]

  2. JASON on September 25th, 2013 4:43 pm

    您好, 針對您所寫的”indy的ftp控件idftp也有bug”一文, 我們也遇到同樣的問題, 想請問是否能將補丁寄給我, 謝謝

    [Reply]

    sunny Reply:

    文章中已经指出了要补丁的函数和要添加的代码位置了啊,只要自己将那行代码添加进去,然后将文件拷贝到工程目录下重新编译就可以了

    [Reply]