- PR -

接続ポート指定のFTP通信

1
投稿者投稿内容
新堂奈津美
会議室デビュー日: 2008/08/05
投稿数: 3
投稿日時: 2008-08-05 23:52
お世話になります。

任意のポート番号(標準の21番以外)を指定してFTPサーバへ接続したいのですが
ソケットクラスではなく、FtpWebRequestクラスを使用して
実装できないでしょうか?

サーバへ接続後に行う処理は、ファイル一覧やダウンロードなど
ごく一般的なことなので、便利なFtpWebRequestを使用したいのですが
番号を指定する方法はないものかと・・・。

やはり、ソケットクラスで自力で実装するしかないでしょうか?
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-08-06 09:54
標準の21番ってことは制御ポートの事ですね。

HTTPでもFTPでも同じです。
ホスト名の最後に:ポート番号で通信ポートを指定可能です。

 ftp://ftp.co.jp/    ←標準の21番使用
 ftp://ftp.co.jp:12345/ ←指定の12345番使用

FtpWebRequestクラスに指定するアドレスを修正するだけで済むと思います。

*試していませんが(ぉぃ
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2008-08-06 12:56
Uriを引数にしたCreateメソッドがあります。
Uriではポートをプロパティに持っているので、こちらならいけるような気がします。

http://msdn.microsoft.com/ja-jp/library/0aa3d588(VS.80).aspx
http://msdn.microsoft.com/ja-jp/library/system.uri.port(VS.80).aspx
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-08-06 14:52
引用:

GENZOさんの書き込み (2008-08-06 12:56) より:
Uriを引数にしたCreateメソッドがあります。
Uriではポートをプロパティに持っているので、こちらならいけるような気がします。



文字列で指定した場合でも、CLR内ではURIクラスのコンストラクタに
引き渡しているだけかと思います。
ですので、どちらでもいけると思います。

文字列で渡しても、FtpWebRequestクラスの非公開メンバ変数m_Uri.Portには
文字列で指定したポート番号が設定されています。
新堂奈津美
会議室デビュー日: 2008/08/05
投稿数: 3
投稿日時: 2008-08-06 22:00
くまっちさん、GENZOさん

返信ありがとうございます。

おかげさまで大成功です。
ホスト名の後に「:ポート番号」を指定して
サーバへ接続できることを確認いたしました。

その後、順調に開発を進めていたのですが
もう一点、気になることが出てきてしまいました。

お世話になりついでで恐縮ですが、質問させてください。


接続後、前述の通りいくつかのコマンドを送信していて、
FtpWebRequest.KeepAliveプロパティを
デフォルト値(true)のままにしているのですが
これだと、接続が解放されるのはGCまかせなのでしょうか。

すべてのコマンドを送信したら、
明示的に接続解放する方法はあるでしょうか?
GENZO
大ベテラン
会議室デビュー日: 2003/11/26
投稿数: 111
お住まい・勤務地: 名古屋
投稿日時: 2008-08-06 22:01
引用:

くまっちさんの書き込み (2008-08-06 14:52) より:
文字列で指定した場合でも、CLR内ではURIクラスのコンストラクタに
引き渡しているだけかと思います。
ですので、どちらでもいけると思います。


おっしゃるとおりです。失礼しました。
くまっち
大ベテラン
会議室デビュー日: 2008/01/18
投稿数: 169
お住まい・勤務地: 茨城県のどこか。
投稿日時: 2008-08-07 09:03
引用:

新堂奈津美さんの書き込み (2008-08-06 22:00) より:

明示的に接続解放する方法はあるでしょうか?



MSDN-FtpWebRequest.KeepAlive プロパティ

KeepAliveをtrueにした場合、他の通信(別のFtpWebRequestオブジェクト)でも
その接続を再利用する為に、開放せずに残しておくということです。
最後の通信の際にはfalseに設定しClose()を呼び出せば良いのではないでしょうか。

[ メッセージ編集済み 編集者: くまっち 編集日時 2008-08-07 09:19 ]
新堂奈津美
会議室デビュー日: 2008/08/05
投稿数: 3
投稿日時: 2008-08-07 18:44
引用:

くまっちさんの書き込み (2008-08-07 09:03) より:

最後の通信の際にはfalseに設定しClose()を呼び出せば良いのではないでしょうか。




そうですね!!そうします。

迅速且つ丁寧にご対応いただき、感謝いたします。

どうもありがとうございました。
1

スキルアップ/キャリアアップ(JOB@IT)