2016-05-16 37 views
1

私たちのDelphiアプリケーションは、クライアントマシン上のIdFTP経由でプロキシサーバーを使用して私たちのWebサイトに接続しようとしていますが、いつも「タイムアウトしました」というメッセージが表示されます。私はそれを修正する方法を知らない。IdFTP.Ponnect経由での接続

マイコード:

IdFTP1.Host  :=Website_address; 
IdFTP1.Username :=Website_user; 
IdFTP1.Password :=Website_password; 
IdFTP1.TransferType:=ftBinary; 

IdFTP1.ProxySettings.ProxyType:=fpcmNone; 
IdFTP1.ProxySettings.Host  :=Proxy_server; 
IdFTP1.ProxySettings.Port  :=Proxy_port; 
IdFTP1.ProxySettings.Username :=Proxy_username; 
IdFTP1.ProxySettings.Password :=Proxy_password; 

IdFTP1.Connect; 

... '読み取りタイムアウトした' 例外を返します。

ウェブで考えられた解決策を見て、以下のさまざまな組み合わせを試したことがあります(機能する組み合わせがあるかもしれませんが、私がやっていることは分かりません):

IdFTP1.IOHandler    :=TIdSSLIOHandlerSocketOpenSSL.Create 
                (IdFTP1); 
IdFTP1.UseTLS     :=utUseExplicitTLS; 
IdFTP1.NATKeepAlive.UseKeepAlive:=True; 
IdFTP1.NATKeepAlive.IdleTimeMS :=100000; 
IdFTP1.DataPortProtection  :=ftpdpsPrivate; 

私のマシンではテストできません。新しいバージョンのアプリケーションをコンパイルし、マシンにコピーして、動作しているかどうかを確認する必要があります。

私が知る限り、クライアント側のインストールについては何も複雑ではありません。彼らは私にプロキシのホストアドレスを与えました。プロキシのユーザ名とパスワードは空白です。

アプリケーションの他のビットは、HTTPとプロキシサーバーを経由して同じWebサイトに接続します。これは完全に機能します。だから、私の論理は、それがファイアウォールやそれに類するものではないということです。

IdHTTP1.HandleRedirects    :=True; 
IdHTTP1.ProxyParams.BasicAuthentication:=True;                        
IdHTTP1.ProxyParams.ProxyServer  :=Proxy_server; 
IdHTTP1.ProxyParams.ProxyPort   :=Proxy_port;     
IdHTTP1.ProxyParams.ProxyUsername  :=Proxy_username; 
IdHTTP1.ProxyParams.ProxyPassword  :=Proxy_password; 

私はDelphi XE8を使用しています。

私たちのテスト用に仮想サーバーを作成し、Windows 7 64ビットを実行します。

更新

レミー、これは正しい考えているのですか?私が抱えている問題の1つは、TIdConnectThroughHttpProxyコンポーネントです。これはuses句に入れる必要がありますか?デルファイはそれを認識していません。

var 

TempIO : TIdIOHandlerStack; 
TempProxy : TIdConnectThroughHttpProxy; 

......

TempIO     :=TIdIOHandlerStack.Create; 
TempProxy    :=TIdConnectThroughHttpProxy.Create; 
TempProxy.Host   :=Proxy_host; 
TempIO.TransparentProxy:=TempProxy; 
IdFTP1.IOHandler  :=TempIO; 

IdFTP1.Connect; 

アップデート2

明確さのポイント:成功したプロキシサーバーを介してWebサーバに到達しているHTTPリクエストがに行きますFTP要求とは異なるWebアドレス。つまり、両方とも同じプロキシサーバーを経由しますが、宛先アドレスは異なります。ちょうどこれが使用の場合に備えて。

私は今、問題を見つけるためにFiddlerを使ってみましたが、これは素晴らしいアイデアですか?私の理解は、Fiddlerはプロキシサーバーとして機能するので、私は同じ問題に遭遇したかどうかを知ることができると考えました。確かに、接続することはできません。

私の手順を明確にすることが:

実行バイオリン弾き、および「FTP要求をキャプチャ」というボックスをチェック。

私IdHTTPコンポーネントを更新します。

IdHTTP1.ProxyParams.ProxyServer:='127.0.0.1'; 
IdHTTP1.ProxyParams.ProxyPort :=Fiddler port; 

私IdFTPコンポーネントを更新します。

IdFTP1.ProxySettings.Host:='127.0.0.1'; 
IdFTP1.ProxySettings.Port:=Fiddler port; 

は、だから今、私は完全にクライアントの設定を削除した、私はバイオリンを使用して、私のローカルマシンから問題をミラーリングしています私が知る限り。私がFiddlerを使わなければ、すべてがうまくいく。上記のようにFiddlerを使用すると、HTTP要求は正しく機能しますが、FTP要求は接続できません。

これを試して解決するために何ができるかについてのアイデアはありますか?私は間違っているのは本当にばかげたことだと確信しています。

+0

多くの試行錯誤の末、問題はクライアント側で発生していました。上の最初の 'Update'ヘッダの下のコードは正しいもので、HTTPプロキシ経由でFTP経由で接続しようとするとうまくいきます。 'Update 2'の下のテキストは無視してください。 Fiddlerを使ってテストしようとしても全くうまくいきませんでした。私はCCProxyを使いました。これは非常に役に立ちました。もう一度@Remy Lebeauの答えを下さってありがとうございます。 – Alex

答えて

1
IdFTP1.ProxySettings.ProxyType:=fpcmNone 

これは、FTP対応のプロキシと通信していないTIdFTPを伝えます。 TIdFTP.ProxySettingsプロパティを使用する場合は、ProxyTypeを設定する必要があります。TIdFTP.Connect()ProxySettings.Hostに接続し、TIdFTP.Login()はプロキシにログインして次のホストに接続するためにどのようなコマンドを送信する必要があるかを知ります。

TIdFTP.ProxySettingsはFTPプロキシでのみ機能することに注意してください。別のタイプのプロキシに接続する必要がある場合は、TIdFTP.Connect()に電話する前にTIdIOHandler由来のコンポーネントをプロパティに割り当ててからTIdCustomTransparentProxyに由来するコンポーネントをTIdIOHandler.TransparentProxyプロパティに割り当てなければなりません。 HTTPプロキシに接続するには、TIdHTTP.ProxyParamsが使用されているので、TIdConnectThroughHttpProxyを使用します。 SOCKSプロキシに接続するには、TIdSocksInfoを使用します。

+0

ありがとう@レミー・ルボー。私はこれを正しく動作させるにはどうしたらいいのか分かりません。上のコードを見て、これが正しいアイデアかどうか、また私が間違っている場所を教えてください。 – Alex

+0

はい、それは基本的な考え方です。 'TIdConnectThroughHttpProxy'コンポーネントは' IdConnectThroughHttpProxy'ユニットにあります。 'Enabled'プロパティをtrueに設定することを忘れないでください。また、FTPで暗号化を使用する場合は、 'TIdSSLIOHandlerSocketOpenSSL'のようにSSLIOHandlerを使用する必要があります。 –

+0

もう一度@Remy Lebeauに感謝します。まだこれと戦って、私は選択肢を試してみました。アップデート2を見ていただけますか、私はこれを別の角度で解決しようとしました。おそらくいくつかのアイデアがありますか? – Alex