• 締切済み

ftpクライアントでの接続後の、サーバ側のファイル一覧の取得方法

c言語で、ftpプロトコルを使用し、ftpサーバまで接続することができたまでは良かったのですが、サーバ側のファイル一覧を取得する方法(フローチャート)が分かりません。 すみませんが、ご教授よろしくお願いいたします。

みんなの回答

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.4

本気でネットワークプログラミングをするなら「インターネットRFC辞典(ASCII)」と「増補版」は必須です。 http://www.amazon.co.jp/exec/obidos/ASIN/4756118887/qid=1053477442/sr=1-2/ref=sr_1_2_2/249-9381086-9465166 http://www.amazon.co.jp/exec/obidos/ASIN/4756140637/ref=pd_bxgy_text_2/249-9381086-9465166 ネット上に転がっているRFC和訳は「個人の趣味」や「ボランティア精神」での公開なので、仕事の資料としては不安です。 ネットワークAPIについては機種/OSがわからないと何ともいえません。 Windowsと仮定すると「WinSock2.0プログラミング―Window Socket APIによるネットワークプログラミングのすべて(ソフトバンクパブリッシング)」がよいかと思われます。 http://www.amazon.co.jp/exec/obidos/ASIN/4797306882/249-9381086-9465166

996
質問者

お礼

ありがとうございます。 情報が不足して申し訳ありませんが、開発環境のOSはlinux、gccで開発しております。

  • hofuhofu
  • ベストアンサー率70% (336/476)
回答No.3

ネットワーク関連のプログラムを組まれるのでしたら、できればRFCを読まれたほうがいいと思います。 応答コードなどはうんざりするぐらい定義されています http://www.wu-ftpd.org/rfc/ 一部は日本語に翻訳されています。 http://www.mars.dti.ne.jp/~torao/rfc/ http://www.se.hiroshima-u.ac.jp/~isaki/rfc/list.html 現在のFTPのコアな部分は959/1123で定義されているようです。 プロトコルの解説についてはこちらが参考になるでしょうか。 http://x68000.startshop.co.jp/~68user/net/ftp-1.html 同サイトにソケットを直に使ったC言語のサンプルプログラムもあります。 http://x68000.startshop.co.jp/~68user/net/c-ftp-1.html Activeモードでなら、PORTコマンドで自IPとポートをサーバに送って、サーバからそのポートに接続があるのを待ち受ける形になるはずです。

996
質問者

お礼

やはりRFCをよく読んだほうがいいということですね。肝に銘じておきます。 ただ、現状ではネットで記述部分の大半を調べているのですが、ネットワークやソケット関係の関数をまだ把握していない部分があります。そのために何参考になる参考書と思ったのですが。 この考え方は間違いでしょうか?

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

コマンドラインftpが使える環境であればデバッグモードで起動してください。 クライアント/サーバー間のすべてのやりとりが表示されます。

996
質問者

補足

やってみます。 あと、すみませんが、お薦めの参考書など教えていただけないでしょうか?

noname#205142
noname#205142
回答No.1

めんどくさいのでPassive modeの場合を。 FTPはコマンドの送信とデータの受信を別々のSocketで交わします。とりあえず21/tcpに繋いでログインした後、PASVコマンドを送信してその応答を取得します。 % telnet ftp.example.jp 21 入力>USER username 入力>PASS password 入力>PASV 応答<227 Entering Passive Mode (127,0,0,1,68,89) この際返される(127,0,0,1,68,89)の文字列をデータ送受信用に使用するアドレスとして利用します。とりあえず後ろの2つの数字を切り出して 68 * 256 + 89 して求めた数値がデータ受信用のポート番号です。このポート番号に新たにSocketを張っておいて、最初に繋いでおいた21/tcpのSocketでLIST, NLSTなどなどのデータ受信用のコマンドを叩くと、後からはったもう一方のソケットにその応答が帰ってきます。 大雑把ですがこんな感じです。telnetコマンドでこの流れを試すことができますので、とりあえずやってみるとよいかと思います。

996
質問者

補足

ありがとうございます。 passive modeではなく、Activeで、LISTなどを送信しましたら、問題なくファイル一覧が表示されました。 ただ、言われたようにtelnetコマンドで使用いたしました。LISTやCDWなどは動作確認いたしましたが、データのダウンロード時(get)に、パーミッションエラーが表示されたのは何故なのですか? ユーザーやグループをftpなどに変更する必要があるのですか?