ラベル Indy の投稿を表示しています。 すべての投稿を表示
ラベル Indy の投稿を表示しています。 すべての投稿を表示

2009年9月3日

Indy10のTIdFTPコンポーネントのパッシブモードのGetメソッドの不具合

Delphi 2007またはそれ以前のバージョン用のIndy10の最新ナイトリ(Ver10.2.3 r3568)のTIdFTPのGetメソッドには、パッシブモードで呼び出したときにTransferTimeoutプロパティの値が使用されずに永久に受信待ちになってしまう不具合があります。
TIdFTP.InternalGetメソッド内でInitDataChannelを呼び出してFDataChannel.IOHandlerのReadTimeoutにTransferTimeoutを設定しているのですが、DataChannelのReadTimeoutがデフォルトの-1のままになっているため、LPasvCl.Connectの呼び出しの内部でDataChannel.IOHandler.ReadTimeoutにFDataChannel.ReadTimeoutを設定して結果的にTransferTimeoutの値が無視されてしまう、というのが原因と思われます。
回避策としてはOnDataChannelCreateイベントでDataChannel.ReadTimeoutにもTransferTimeoutを設定してしまう、という方法が考えられます。
procedure TDataModule1.IdFTP1DataChannelCreate(ASender: TObject;
                                               ADataChannel: TIdTCPConnection);
begin

  if (ASender <> nil) and (ASender is TIdFTP) then
  begin
    if (TIdFTP(ASender).Passive = True) and
       (ADataChannel <> nil) and (ADataChannel is TIdTCPClientCustom) then
    begin
      TIdTCPClientCustom(ADataChannel).ReadTimeout := TIdFTP(ASender).TransferTimeout;
    end;
  end;

end;

2009年5月27日

Indy 10のアップデート

最近のDelphi/C++Builder/RAD Studioではネットワーク関係のライブラリとしてIndyの使用が推奨されており、実際にDelphi 2007には10.1.5が、Delphi 2009には10.2.3がそれぞれ標準で添付されています。しかし最新のnightlyは10.5.5(2009/05/27現在)となっており、DEKOさんの指摘のとおり不具合を修正するには最新にアップデートすることが必要です。ということでメモ。

Delphi 2009 に最新版の Indy10 をインストールする
Delphi 5~2007 に最新版の Indy10 をインストールする
Unicode 版 Delphi (2009 以降) に最新版の Indy10 をインストールする [Delphi Programming]
ANSI 版 Delphi (5~2007) に最新版の Indy10 をインストールする [Delphi Programming]

ところでindy10.zipは10.2.3、IndyTiburon.zipは10.5.5ですが、名前に反してIndyTiburon.zipはDelphi 2007およびそれ以前にも導入可能のような気がします。あとでDelphi 2007で更新を試してみます。