« Wiresharkのフィルター | トップページ | アプリからFTPを実行する(2)-外部コマンドコール »

2014.03.05

アプリからFTPを実行する(1)-自前処理

昨日の続き的なエントリー。
そもそもの発端はアプリケーションからFTP処理を実施したときに、成功するサーバと失敗するサーバがあることからFTPがどうなってるのかを調べようとしていたのだった。

アプリからFTP処理を行うには簡単にわけて2種類の方法がある。
 1.自前でFTPコネクションからクローズまで取り扱う
 2.シェルなどにて外部でFTP処理を行う
今回は1を実行している環境での問題であった。

※本稿では具体的なFTPクライアントの組込みは触れません。FTP組み込みを行った場合のバッドパターンの一例として捉えていただければコレ幸い。

さて、このFTPの成否を分けた結論は、プログラミングがイマイチであった。

FTPのコネクションを行う場合、次のような順序で処理を行うのがセオリーである。

SeqClient------Server
1接続要求開始------>受信
2受信<------Response 220: Service ready for new user.
3ユーザー名------>受信
4受信<------Response 331: User name okay, need password.
5パスワード------>受信
6受信<------Response 230: User Logged in.
7転送モード(TYPE)指定------>受信
8受信<------Response 200: モード変更成功通知
9PASV指定------>受信
10受信<------Response: 150 Opening BINARY mode data connection.
11受信<------Response: 227 Entering Passive Mode
12ファイル送信処理------>受信
13受信<------Response 226: 送信成功通知
14Quit------>受信
15受信<------Response 221: Goodbye.

今回対象となったFTPサーバはIIS5.1(WindowsXP環境)とIIS6.1(Windows7環境)であった。
そしてIIS6では処理が正常終了するのに、IIS5ではファイルの転送が成功しなかった。

どちらのFTPサーバも、コマンドラインベースでログインした場合は正常にログインでき、ファイルの転送(put/get双方)も問題なく終了する。
しかし、アプリから実行すると、IIS5ではダメなのだ。

幸いWindowsなので、双方にWiresharkを入れてFTPの動きを比較してみた。

IIS5.1IIS6.1

違いがお分かりになったろうか?

ポイントはログイン処理の前にあった。
プログラムは先ほどの処理シーケンスのNo3の前に"TYPE I"という転送モード指定を実行していたのだった。本当はNo7のようにログイン後に転送モード指定を行うのが筋であるのにだ。
このときに、IIS6.1ではログイン前であってもこのリクエストを受付たのに対し、IIS5.1ではログイン前なので「まだログインしてないよ(Response 530:Not logged in)」、とつれないお返事をしてきたために、転送処理どころか、そもそもログイン処理もさせてもらえずにクライアントが終了してしまっていたのだった。

IIS6.1は融通が利いたのでたまたまセーフだったので発見が遅れたのだが、プログラム側の実行順序を見直すことで、当件は一件落着となったのだった。

あとおまけ情報。WindowsXPにはIIS6はインストールできない。XPはもうすぐEOSになってしまうので、絶対にIIS5で動かさなければならない、ということは覚えておいても良いかも。
ん? EOSだからむしろ不要な知識かな(^^;?

|

« Wiresharkのフィルター | トップページ | アプリからFTPを実行する(2)-外部コマンドコール »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/2022/59236341

この記事へのトラックバック一覧です: アプリからFTPを実行する(1)-自前処理:

« Wiresharkのフィルター | トップページ | アプリからFTPを実行する(2)-外部コマンドコール »