none
ポート番号指定のFTPへのアップロードについて RRS feed

  • 質問

  • いつもお世話になります。ご存じな方がいらっしゃればお教えください。

    FTPに接続してファイルをアップロードするアプリを開発中なのですが、普段は普通にできることが今回は「ポート番号」が指定されているせいか、特殊なサーバーなのか上手くアップロードできません。何か良い方法はないでしょうか?

        //アップロード先のURI
        Uri u = new Uri("ftp://ftp.xxx.ne.jp:123/aaa.csv");//123はポート番号

        FtpWebRequest req = (FtpWebRequest)WebRequest.Create(u);
        req.Credentials = new NetworkCredential("username", "password");
        req.Method = WebRequestMethods.Ftp.UploadFile;

        req.UsePassive = true;

        using (Stream reqStrm = req.GetRequestStream();//←ここでエラーが出る
        ・・・・・・

    上記のコードで下記のエラーが出ます。
    サーバーは PASV コマンドへの応答で、FTP 接続が確立されたアドレスとは異なるアドレスを返しました。

    req.UsePassive = false では、下記のエラーが出ます。
    リモート サーバーがエラーを返しました: (500) 構文エラーです。コマンドが認識できません

    ポート番号(123)を指定しないと、下記のエラーが出ます。
    基礎になる接続が閉じられました: 受信時に予期しないエラーが発生しました

    このFTPの使用方法は、パッシブモードを使用し、ポート番号を「123」にすると指定されています。

    また、最初の設定でreq.Method = WebRequestMethods.Ftp.GetFileSize;(aaa.csvがFTPに存在するとき)
    とすれば、UsePassive = falseでもtrueでも正常にファイルサイズを求めることが出来ます。

    ちなみに、同じコードで違うFTPサーバーに置き換えて実行するともちろん正常にアップロードできます。

    よろしくお願い致します。
    2009年8月10日 4:30

回答

  • これはFTPサーバの設定が間違っているので、クライアントプログラム側では対処できません。言い換えるとPASVモードでの接続はプロトコル上、不可能です。
    よくあるのはNATなどでアドレス変換しているのにサーバおよびNATがそのネットワーク構成に対応していない、とかですね。
    FTP の RFC を隅々まで見たわけではないので、間違っている・いないは断言できかねますが、そのような運用をしているサーバーがあるようです。(コントロールコネクションとデータコネクションが違うホストになる)

    なお、.NET Framework の標準のクラスはそのような設定のサーバーに対応していません(安全性を重視)。ご自身で FTP クライアントクラスを実装するか、別途ライブラリを利用して下さい。


    DOBON さんのサイトの掲示板で過去にこのようなスレッドもありました。(ちょっと荒れ気味になってしまいましたが…)
    http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=24575&no=0&KLOG=3

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年8月10日 11:34
    モデレータ

すべての返信

  • 上記のコードで下記のエラーが出ます。
    サーバーは PASV コマンドへの応答で、FTP 接続が確立されたアドレスとは異なるアドレスを返しました。
    これはFTPサーバの設定が間違っているので、クライアントプログラム側では対処できません。言い換えるとPASVモードでの接続はプロトコル上、不可能です。
    よくあるのはNATなどでアドレス変換しているのにサーバおよびNATがそのネットワーク構成に対応していない、とかですね。

    req.UsePassive = false では、下記のエラーが出ます。
    リモート サーバーがエラーを返しました: (500) 構文エラーです。コマンドが認識できません
    それはFTPサーバのバグかな。PORTモードが未実装というのは考えにくいですが…。

    ポート番号(123)を指定しないと、下記のエラーが出ます。
    基礎になる接続が閉じられました: 受信時に予期しないエラーが発生しました
    ポートが違うから繋がらなかったとかだと思います。

    このFTPの使用方法は、パッシブモードを使用し、ポート番号を「123」にすると指定されています。

    また、最初の設定でreq.Method = WebRequestMethods.Ftp.GetFileSize;(aaa.csvがFTPに存在するとき)
    とすれば、UsePassive = falseでもtrueでも正常にファイルサイズを求めることが出来ます。
    サイズ取得に関してはPORTモード / PASVモードに依存せず、接続&ログインが成功すれば動作します。

    ポート番号指定とは関係なく、おやぢ2007さんおよびそのFTPサーバの管理者さんはFTPというプロトコルを理解されていないのでは。
    そのため、最初に述べたようにFTPを使用するに当たって必要なネットワーク設定がなされていないのだと思います。
    なので、そのFTPサーバのポート番号を標準ポートに変更しても依然としてアップロードできないかと思います。
    2009年8月10日 6:00
  • ポート番号指定とは関係なく、おやぢ2007さんおよびそのFTPサーバの管理者さんはFTPというプロトコルを理解されていないのでは。
    そのため、最初に述べたようにFTPを使用するに当たって必要なネットワーク設定がなされていないのだと思います。
    佐祐理さん、早速のお返事ありがとうございます。

    おっしゃるとおり私は恥ずかしながら、FTPプロトコルをよく理解しておりません。ただFTPサーバの管理者は有名なショッピングモールですので理解していないと言うことは考えられません。
    ドリームウィーバーなどでFTPの指定の設定方法通り、

    ○パッシブモードを使用
    ○ポート番号を「123」(仮)に設定

    と設定すれば正常に接続できます。
    2009年8月10日 7:13
  • これはFTPサーバの設定が間違っているので、クライアントプログラム側では対処できません。言い換えるとPASVモードでの接続はプロトコル上、不可能です。
    よくあるのはNATなどでアドレス変換しているのにサーバおよびNATがそのネットワーク構成に対応していない、とかですね。
    FTP の RFC を隅々まで見たわけではないので、間違っている・いないは断言できかねますが、そのような運用をしているサーバーがあるようです。(コントロールコネクションとデータコネクションが違うホストになる)

    なお、.NET Framework の標準のクラスはそのような設定のサーバーに対応していません(安全性を重視)。ご自身で FTP クライアントクラスを実装するか、別途ライブラリを利用して下さい。


    DOBON さんのサイトの掲示板で過去にこのようなスレッドもありました。(ちょっと荒れ気味になってしまいましたが…)
    http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=24575&no=0&KLOG=3

    解決した場合は、参考になった返信に「回答としてマーク」のボタンを利用して、回答に設定しましょう(複数に設定できます)。
    2009年8月10日 11:34
    モデレータ
  • FTP の RFC を隅々まで見たわけではないので、間違っている・いないは断言できかねますが、そのような運用をしているサーバーがあるようです。(コントロールコネクションとデータコネクションが違うホストになる)

    DOBON さんのサイトの掲示板で過去にこのようなスレッドもありました。
    http://dobon.net/cgi-bin/vbbbs/cbbs.cgi?mode=al2&namber=24575&no=0&KLOG=3
    Azuleanさんご回答ありがとうございます。そのような特殊な運用をしているサーバーがあるとは思っても見ませんでした。

    私がアップロードしようとしているFTPは、お察しの通り楽天市場ゴールドのFTPです。DOBON さんの掲示板の中にTKFPを使用してアップロード・ダウンロードができるようになったというふうに書いてありましたが、私もその方法を試してみたいと思います。

    大変参考になりました。ありがとうございました。
    2009年8月10日 23:08
  • 補足ありがとうございます。
    そのような構成・運用が可能なのは知っていました。
    ただし、そこまでわかっているFTPサーバ管理者ならば「パッシブモードを使用し、ポート番号を「123」にする」などと簡単な説明で終わるはずはなく、特殊なサーバであることを説明するはず、と思い除外しました。
    私の断言も多少嘘が入っていましたね、すみません。
    2009年8月11日 2:33
  • TKFPを使用して試してみたところ問題なく接続でき、アップロード・ダウンロードができるようになりました。

    Azuleanさん、佐祐理さん、ありがとうございました。
    2009年8月11日 5:21