GetFtpConnectionがタイムアウト

このQ&Aのポイント
  • C++のプログラム操作から、FTPを利用してサーバ上のファイルをダウンロードする処理を構築中です。
  • VisualStudioのWin32コンソールアプリケーションから、GetFtpConnectionで自家サーバに接続しようとしたところ、関数の処理内で先に進まなくなってしまい、そのうちに「処理がタイムアウトになりました」というメッセージボックスがあらわれます。
  • ネット上に存在するFTPサーバに対する接続を、ローカルで行おうとしていることから起きている問題なのかもとは思うものの、それが正しいのか、正しいとしてどうすれば良いのかまったく見当もつかないでいます。
回答を見る
  • ベストアンサー

GetFtpConnection(~)がタイムアウトしてしまいます。

GetFtpConnection(~)がタイムアウトしてしまいます。 C++のプログラム操作から、FTPを利用してサーバ上のファイルをダウンロードする処理を構築中です。 とりあえずの練習用にと「AnHTTPD」を導入しました。 VisualStudioのWin32コンソールアプリケーションから、GetFtpConnectionで自家サーバに接続しようとしたところ、関数の処理内で先に進まなくなってしまい、そのうちに「処理がタイムアウトになりました」というメッセージボックスがあらわれます。元々20秒だったタイムアウトの設定を60秒にしてみましたが結果は変わらず、接続に時間がかかっているだけだというわけでもないようです。 ひょっとすると、ネット上に存在するFTPサーバに対する接続を、ローカルで行おうとしていることから起きている問題なのかもとは思うものの、それが正しいのか、正しいとしてどうすれば良いのかまったく見当もつかないでいます。 以下、FTPダウンロード検証用に試作中の・・・というのもお恥ずかしいプログラムです。 まったくのゼロからの開発中ですので、問題点の指摘や改善へのご指南を、どうかひとつお願いいたします。 //////////////////////////////////////////// #include <afxinet.h> int main() { CFtpConnection *pConn = NULL; char *lpszServerName = "210.250.71.132"; //CInternetSessionのインスタンス作成 CInternetSession session( "My FTP Session" ); //CFtpConnectionオブジェクトの作成 try { pConn = session.GetFtpConnection( lpszServerName,0,0,0, TRUE ); } catch( CInternetException *ep ) {//エラー ep->ReportError(); ep->Delete(); } //取得 char *pstrRemoteFile = "C\\homepage\\test"; char *pstrLocalFile = "C\\TEST_DL.txt"; if( !pConn->GetFile( pstrRemoteFile, pstrLocalFile, FALSE, FILE_ATTRIBUTE_NORMAL, FTP_TRANSFER_TYPE_BINARY, 1 ) ) { MessageBox( NULL, "ファイルの取得に失敗", "FPS_GetFile", MB_OK|MB_ICONHAND ); } pConn->Close(); session.Close(); return 0; } //////////////////////////////////////////

質問者が選んだベストアンサー

  • ベストアンサー
  • samtomsan
  • ベストアンサー率55% (1060/1897)
回答No.1
fillet_o_fish
質問者

お礼

回答ありがとうございました。 しかし、これは、ぱっと見にもむずかしいですな。 いや、がんばります。 せっかく教えていただきましたし、この辺でスキルアップしとかないといけないということでしょう。 ただちょっと、実際に「参考になりました! 助かりました!」といえるには時間がかかりそうなので、 お先に回答と助言をいただけたことに感謝の意を表して、、、 勉強させていただきます。

その他の回答 (1)

回答No.2

> ひょっとすると、ネット上に存在するFTPサーバに対する接続を、ローカルで行おうとしていることから起きている問題なのかもとは思うものの、それが正しいのか、正しいとしてどうすれば良いのかまったく見当もつかないでいます。 ftpクライアントで接続できるか試してみればいいだけの話です。 > pConn = session.GetFtpConnection( lpszServerName,0,0,0, TRUE ); 接続先のポート番号が0になってますが。

fillet_o_fish
質問者

お礼

回答ありがとうございました。 お教えくださった「FTPクライアント」を試してみるつもりですが、 なにぶん技術力が追いつかず、結果を出してからの返答がいつになるかわからないので、 お先のお礼とさせていただきます。 >接続先のポート番号が0になってますが。 先のソース以前にはFTPの「21」番を指定してやってはいたのですが、まったく同様の結果であり、 ここではデフォルトのままで最後のパッシブかアクティブかを切り替えてみたらどうかと試していたのでした。 これから、教えていただいた内容を参考に、やってみます。

関連するQ&A

  • フリーFTPソフトBASP21のタイムアウト

    現在、こちらで(↓)提供されているフリーのFTPライブラリ「BASP21」を使用して http://www.hi-ho.ne.jp/babaq/index.html FTPでのファイルダウンロードを行なっています。 OSはWindowsXP、開発言語はVB6.0です。 使い方はいたってシンプルで、抜粋したソースを以下に示します。 ' FTPオブジェクトの生成 Set FTPObj = New BASP21Lib.FTP ' コネクト (各変数には適切な値が入っています) rResult = FTPObj.Connect(URL, User, Pass) ' 指定ファイルの受信 rResult = FTPObj.GetFile(RemoteFilePass, LocalFilePass) ' FTPオブジェクトの破棄 Set FTPObj = Nothing この処理をファイル数分(RemoteFilePass/LocalFilePass)、繰り返しています。 Connect関数で指定するタイムアウト時間は、10秒としています。 するとなぜか、最初の1個目のファイルだけタイムアウトエラーとなってしまいます。 2個目以降のファイルは問題なく受信できています。 試しにタイムアウト時間を30秒にすれば1個目のファイルも受信できるのですが、 OpenLog関数で出力されるFTP実行ログを見ますと、最初の1個だけGetFile関数 に21秒もかかっており、 (1) RETR /ファイルパス (2) 150 Opening ASCII mode data connection for /ファイルパス ※(1)と(2)の間が21秒かかっている 2個目以降のファイルは1秒以下で受信できています。 どうして最初の1個だけ異常に長い時間がかかっているのか分からず、悩んでいます。 環境的な問題(FTPサーバとか、BASP21とか…)なのでしょうか? もし心当たりのある方がいらっしゃいましたら、ヒントや、回避方法のアドバイスなど 頂ければ大変助かります。 ちなみに、BASP21は最新版を使用しています。 以上、よろしくお願い致します。

  • CGIでサーバタイムアウトを避ける方法

    cgiアプリで、かなり時間のかかるDB登録処理を作成しています。 で、サーバのタイムアウトになりアプリがIIS Serverにkillされてしまうのですが そのkillされるタイミングを知る方法はあるでしょうか? といいますのはkillされてしまうとフラグクリアなどの後処理ができず、 他のセッションからも処理ができなくなってしまうのです。 タイマー監視ではなく、その時のサーバのステータスなどがわかるといいのですが。 因みにサーバのタイムアウトの時間を変更することはできないんです。 または、それを回避させるために、 処理の途中でhttpレスポンスなどを発行して処理を継続させる方法など あるのでしょうか? 今はタイムアウト時間前に処理が終了できるよう かなり処理件数を制限していまして、   使いづらい といわれてします。 環境  windows server 2003  IIS で、 アプリはc言語で開発しています。

  • セッションタイムアウトの設定時間通りにならない

    C#によるWebアプリケーションを開発しています。 セッションタイムアウトの設定を240分としていますが、 240分前にタイムアウトになってしまいます。 設定時間通りにタイムアウトにならない事象が発生しており、 原因を究明しています。 【状況】 Web.configとIISにて、セッションタイムアウトの時間を 設定しております。 (1)Web.configの設定 Web.config内にて、 <sessionState timeout = "240" /> のタグを設けて、セッションタイムアウトの時間を240分としています。 (2)IISの設定 IISにて、アプリケーションの構成の【オプション】タブにて、 「セッションのタイムアウト」を240分としています。 【環境】 OS:Windows Server 2003 Webサーバ:IIS6.0 DBサーバ:SQL Server 2005、 セッションタイムアウトが指定時間に行われない原因について、 ご教授の程お願い致します。

  • セッションタイムアウトエラー

    いつも参考にしております。 セッションタイムアウトのエラー(???)で困ってます。 ご存知の方がいらっしゃいましたら、ご教授お願いします。 環境: OS :Windows 2009 Sever ActivePerl : V5.8.9 Webサーバ :IISv7.0 CGI::Session.pm:v4.41 DB :Oracle 10g 詳細は下記のようです。 1.ログイン成功したら、セッションを作成します。 CGI::Session->name( "SID" ); my $session = new CGI::Session( "driver:File", undef, {Directory => 'C:/Inetpub/wwwroot/xxx/tmp/session'} ); $session->expire( '+10h' ); ...省略 2.上記で作成されたセッションIDを画面に保持し、画面遷移する際に セッションIDの存在チェックを行う my $session = CGI::Session -> new( undef, $sid, {Directory => 'C:/Inetpub/wwwroot/xxx/tmp/session'} ); if($sid eq $session -> id) { // セッションID存在する // 次の画面遷移する // セッションタイムアウト再設定 $session->expire( '+10h' ); } else { // セッションID存在しない $session->close; $session->delete; // 作成されたセッションファイルを削除 // エラー画面表示 } 現象: セッションタイムアウトの設定時間に経ってないにもかかわらず たまたまセッションタイムエラーが発生します。 P.S エラーの原因が特定できず、困ってます。 以上、宜しくお願いいたします

    • 締切済み
    • CGI
  • リモート接続に対するセッション・タイムアウトについて

    リモート端末から telnet でサーバにアクセスすることがあるのですが、ダイヤルアップ回線で品質が極めて悪く、数秒間不通になったりすることもあるため、その間にセッションが切れてしまい、何度も再接続を行わなければならず、処理効率が悪くて困っています。 何らかのカーネルパラメータの変更等により、タイムアウトまでの時間を長くするなどと行ったことができないでしょうか?

  • セッションのタイムアウト時間変更

    PHP4.4.1+ホスティング セッションのタイムアウト時間を、サーバ設定の変更なしで、 変更することは可能でしょうか? 変更する関数とかって無いでしょうか? ホスティングなので、サーバ設定の変更ができなくて。 ちなみに、今は初期値の1440秒になっています。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • C#~SQL2005で勝手にタイムアウト

    C#とSQL Server2005との連携でConnectionStringに connection timeout=60 を設定していますが、 30秒程度でタイムアウトしてしまいます。 タイムアウトの設定はソースコード上以外に、 SQL Server上でも設定が必要なのでしょうか?

  • セッションタイムアウトになった時

    やりたいことは 1)セッション情報を取り出す 2)取り出した値を使ってDBに書き込みする 3)セッション情報を破棄する です。 http://oshiete1.watch.impress.co.jp/qa455453.html ほぼここの方と同じです。 ここの方はうまくいったようなのですが・・・ 初心者で悩んでいます。よろしくお願いいたします。 HttpSessionBindingListener セッションが切れた(valueUnbound)時 getAttribute("aaa")で "1111111"←ユーザーIDを取得したい。 req_.getSession().getAttribute("aaa");で取得できません。 よろしくお願いします。 import java.io.*; import javax.servlet.*; import javax.servlet.http.*; /** セッション開始終了処理のテストサーブレット **/ public class SessionServlet extends HttpServlet implements HttpSessionBindingListener { HttpServletRequest req_; HttpServletResponse res_; public void valueBound(HttpSessionBindingEvent arg0) { System.out.println("valueBound"); } public void valueUnbound(HttpSessionBindingEvent arg0) { System.out.println(req_.getSession().getAttribute("aaa")); System.out.println("valueUnBound"); } public void service (HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { req_=req; res_=res; HttpSession session1 = req.getSession(); res.setContentType("text/html; charset=Shift_JIS"); req.setCharacterEncoding("Shift_JIS"); PrintWriter out = res.getWriter(); // パラメータの取得 String act = req.getParameter("act"); // ログイン処理 if (act == null) { // セッション変数の作成、設定 SessionServlet data = new SessionServlet(); session1.setAttribute("aaa", "1111111"); session1.setAttribute("data", data); // セッション開始画面の表示 out.println("<html><body>"); out.println("<h1>セッション開始</h1>"); out.println("<form method=\"POST\" action=\"SessionServlet?act=lo\">"); out.println("<input type=\"submit\" value=\"logout\">"); out.println("</form>"); out.println("</body></html>"); out.close(); // ログアウト処理 } else { // セッション終了画面の表示 out.println("<html><body>"); out.println("<h1>セッション終了</h1>"); out.println("</body></html>"); out.close(); // セッションの無効化 session1.invalidate(); } } }

  • wshで起動したコマンドををタイムアウト終了させる

    たとえば以下のようなバッチファイルとvbsファイルを用意して test.batを実行した場合 ftpのダウンロード処理が完了した後 ダウンロードしたファイルを処理したいのです 以下のようにすれば処理待ちになるのでそこは 実現できるのですが ftp.exeがなんらかの原因で稀に終了しない事があるので そうなるといつまでも処理待ちになってしまうので タイムアウトさせたいのです ftpコマンドをあえてquitしないで(終了しない状態を再現させる) WScript.timeout=10 をいれてみて試してみたのですが タイムアウトが有効になりません ftpのプロセスは最悪残ってしまってもかまわないのですが 起動をかけたバッチファイルのほうは永遠待ち状態ではなく 一定時間応答がなければ次の処理に移したいのです 何かいいタイムアウトの実装方法はないでしょうか? アドバイスお願い致します test.bat cscript test.vbs ←ここでftp.exeが終了しないと永遠待ち状態になってしまう rem ftpが完了後に行いたい処理 exit test.vbs WScript.timeout=10 CreateObject("WScript.Shell").Run "CMD.exe /C ftp -s:c:\cmd.txt", 1, True

  • セッションタイムアウトによりサーバーとの接続が切れました?

    建設関係のホームページを見ようとしてクリックすると「セッションタイムアウトによりサーバーとの接続が切れました」と出るので見ることが出来ません。今まで何十回も見てきたホームページです。 他のホームページはこの文字は出ないので見れます。 パソコンが故障しているのでしょうか? 解る方どうぞ教えてください。 宜しく、お願いいたします。

専門家に質問してみよう