在宅ワークのリアルをベテランとビギナーにインタビュー>>

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

このQ&Aに関連する最新のQ&A

A 回答 (4件)

本気でネットワークプログラミングをするなら「インターネットRFC辞典(ASCII)」と「増補版」は必須です。


http://www.amazon.co.jp/exec/obidos/ASIN/4756118 …
http://www.amazon.co.jp/exec/obidos/ASIN/4756140 …

ネット上に転がっているRFC和訳は「個人の趣味」や「ボランティア精神」での公開なので、仕事の資料としては不安です。

ネットワークAPIについては機種/OSがわからないと何ともいえません。
Windowsと仮定すると「WinSock2.0プログラミング―Window Socket APIによるネットワークプログラミングのすべて(ソフトバンクパブリッシング)」がよいかと思われます。
http://www.amazon.co.jp/exec/obidos/ASIN/4797306 …
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/05/21 11:11

ネットワーク関連のプログラムを組まれるのでしたら、できれば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. …

現在のFTPのコアな部分は959/1123で定義されているようです。


プロトコルの解説についてはこちらが参考になるでしょうか。
http://x68000.startshop.co.jp/~68user/net/ftp-1. …

同サイトにソケットを直に使ったC言語のサンプルプログラムもあります。
http://x68000.startshop.co.jp/~68user/net/c-ftp- …

Activeモードでなら、PORTコマンドで自IPとポートをサーバに送って、サーバからそのポートに接続があるのを待ち受ける形になるはずです。
    • good
    • 0
この回答へのお礼

やはりRFCをよく読んだほうがいいということですね。肝に銘じておきます。

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

お礼日時:2003/05/20 21:20

コマンドラインftpが使える環境であればデバッグモードで起動してください。


クライアント/サーバー間のすべてのやりとりが表示されます。

この回答への補足

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

補足日時:2003/05/20 15:43
    • good
    • 0

めんどくさいので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コマンドでこの流れを試すことができますので、とりあえずやってみるとよいかと思います。

この回答への補足

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

補足日時:2003/05/20 14:34
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語(gcc), Linux, FTPプログラミング

C言語でFTPを使用してあるサーバからデータをダウンロードするプログラムを作りたいのですが、短期間で作らなければならない為、なるべく作り込みはしたくないのです。
FTPを扱うライブラリのようなものがあるのが一番ありがたいのですが、ご存じないでしょうか?
条件としては
・gccのバージョン3~4ぐらいで使えること。
・Solaris,RedHatなど主要なLinuxで使えること。
・ライセンスの制限がなるべく無いこと。
以上、よろしくお願いいたします。

Aベストアンサー

> FTPでアップロードは出来るという記述はあったのですが

私は逆にget出来る、の記述しか見つけられませんでした。
http://www.libcurl.org/ より:
> libcurl is a free, open source client to get documents/files from servers, using any of the supported protocols.

対応プロトコルの数を考えるとちとftp専用としてはサイズが大きそうな気はしますが、簡単に使えそうではありますね。

QVisual C++からftpを使う

ftpを使って他のPCと通信するプログラムをVisual C++を使って書こうとしています。(相手側PCはftpを拡張していろいろな拡張コマンドを持っています。よって、ftpのコマンドはファイル転送に限られません。)この場合、基本的にどのような形でプログラミングすればいいのでしょうか?
例えば、下の1や2の方法になるのかなと考えてます。

1.WinSockを使ってTCPで相手側PCとセッションを張り、それ以降はftpのコマンドをプログラムから直接送って、リターンも直接解釈するようなプログラムとする。

2.MFCの中にはftpを扱うためのクラスが用意されているのでそれを使う。

ネットワークプログラミングは初心者です。どのような方法が良いか教えてください。また、良いサンプル・コードがありましたらご紹介ください。よろしくお願いします。

Aベストアンサー

1、2どちらを使用するかは、その接続しようとしている
FTPサーバのどの機能(コマンド)を使用するかでかわる
と思います。
FTPサーバとして提供されているのであれば、FTPコマンド
のやりとりの方法は一般的なFTPコマンドと同じはずなので
一般的なファイル転送しか必要ないというのであれば、
MFCのftpライブラリを使用するほうがベストかと思います。
また、そのFTPサーバの特有な拡張機能と使用するのであれ
ば、WinsockでTCP/IPを使用してやり取りするアプリケーション
を作成するのがよいかと思います。
但し、独自でFTPコマンドのやり取りをするアプリケーション
を作成する場合には、FTPサーバとのメッセージのやり取り
の部分を作成するのがちょっと面倒になってくるかもしれません。
FTPサーバから送られてくるメッセージを正常、異常としっかり
把握しておかないとFTPサーバに対応できないかもしれません。

プログラミング初心者であれば、2のほうでやってみたほうが
よいのではないかと思いますが。

Qlinuxでのftpクライアントプログラムをつくるには

Windows(VC++ MFCを使用して)などで ftpクライアントのプログラムを作成することが出来るみたいですが
linux(TURBO LINUX 4.0)で同様なことはできないのでしょうか?

具体的には 以下のようなことがしたいためです。
(1) ftpサーバーにlinuxマシンにてクライアントでログイン
(2) サーバー上のftpホームディレクトリにあるファイルができるまで周期的に監視
(3) 該当するファイルができたらファイルをクライアント側に転送

(1)~(3)を一回のftp接続状態のまま自動的(プログラム)で行ないたいのです。

VC++ MFCでは,FTPを行なうクラスがいくつかあるみたいですが?

どなたかわかりましたら御回答ください。

Aベストアンサー

>Ruby Kylixではなく linux上のC言語ライブラリーかシェルで実現することは不可能でしょうか?

もちろん可能でしょう。libftp というライブラリを使えばできそうですが、
オンラインマニュアルが見つからず、具体的な使い方については力が及びません。m(__)m

ですが、GTK+ を利用した FTP クライアントソフトに「Aria」というものがあります。
またシェルで FTP をサポートしているものはないと思いますが、
"シェルみたいに使える"「lftp」というプログラムもあります。
これらのソースコードを見るのも勉強になるのではないでしょうか。
他にもテキストウェブブラウザの「w3m」は ftp アクセス関数を自前で作っています。

・w3m について
http://w3m.sourceforge.net/index.ja.html
http://www2u.biglobe.ne.jp/~hsaka/w3m/doc-jp/STORY.html

>ただたしかKylixは,オブジェクトpascalという言語で記載すると認識しています。

Kylix はバージョン3からC/C++言語をサポートするようになりました。
その点、下の書籍は情報が古かったですね。言い忘れていました、すみません。

ただ、お使いの TurboLinux がバージョン4.0ということで、
glibc のローダのバグの問題があるかもしれません。
Kylix のトップページから一番下の「Kylix 事前テストプログラム」をクリックして
テストプログラムをダウンロードしてチェックする必要があります。
glibc 2.2 にアップグレードすればバグの心配はありません。

P.S. Ruby もなかなかいいもんですよ。

参考URL:http://aria.rednoah.com/linux_j.shtml,http://snap.shot.cx/1017221027/,http://www.borland.co.jp/kylix/

>Ruby Kylixではなく linux上のC言語ライブラリーかシェルで実現することは不可能でしょうか?

もちろん可能でしょう。libftp というライブラリを使えばできそうですが、
オンラインマニュアルが見つからず、具体的な使い方については力が及びません。m(__)m

ですが、GTK+ を利用した FTP クライアントソフトに「Aria」というものがあります。
またシェルで FTP をサポートしているものはないと思いますが、
"シェルみたいに使える"「lftp」というプログラムもあります。
これらのソースコードを見るの...続きを読む

Qsleep()関数について

"数秒おきに警報をn回鳴らすプログラム"をC言語で作成しようと
考えています。

プログラム実行環境はWindowsですが、
sleep()関数は使用できないのでしょうか??

仮に使用できない場合、この関数に代わる関数や代替方法が
あれば教えて頂けませんでしょうか? 宜しくお願いします。

Aベストアンサー

正確な動作でも構わなければ
windows.hをインクルードして
Sleep()関数を使いましょう.
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200207/02070061.txt

しかし,正確に数秒おきに動作を行いたい場合はマルチメディアタイマ等を使いましょう.
マルチメディアタイマはミリ秒間隔でコールバック関数を呼び出すことができます.
timeSetEventを用いてコールバック関数の登録を行うことができます.
timeKillEventでコールバック関数の解除を行うことができます.

多分他にも方法があると思うのですが…私はこれぐらいしか知りません^^;

参考URL:http://www.katto.comm.waseda.ac.jp/~katto/Class/GazoTokuron/code/time.html

QFTPエラー425

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTertermでログインしてlocalhostにftpするとlsできるので、
ftpd自体に問題はなさそうです。
また、サーバー側の設定は直しておらず、突如動かなくなったので、
クライアントのファイアウォール設定が変わったのを疑っていますが、
ファイアウォールを一時停止しても解消しませんでした。
どこが悪いか原因を切り分けられるずに困っています。
原因箇所を調べる良い方法があればご教示ください。

FTPで425エラーが出て困っています。
今まで繋がっていたのが突然繋がらなくなりました。
調べてみると20番ポートが遮断されている可能性が高く、
どこで遮断されているか調べる良い方法があれば教えて下さい。

・クライアント
OS:Windows 8.1、ファイアウォール: Norton Inernet Security
・サーバー(AWS)
OS:Red Hat Enterprise Linux Server release 7.1 (Maipo)
ファイアウォール:AWSのネットワークルール設定

接続は出来ていて、lsを打つとエラーになります。
サーバーにTerterm...続きを読む

Aベストアンサー

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッセージです。

クライアントソフトはActive FTPで接続しようとしているものの、サーバ側がActive FTPを恐らくサポートしていないので、「Passiveモードに移行してよ」とメッセージを出した。にも関わらずクライアントはPASVコマンドを実行することもなく、LISTコマンドを実行したので「425 Failed to establish connection」、つまり「だぁかぁらぁ、データセション張ってないんだから」と返したわけです。

「Passiveモードでの使用を検討して下さい」というメッセージは柔らかな表現ですが「いいか、俺はPassiveモードしか受け付けないからな。次はPASVコマンドを打てよな。それ以外は知らんからな」と等価です。まぁ、QUITやBINARYやASCII等は受け付けてくれるとは思いますが。

>またサーバーが20番ポートにセッションを張ろうとしている形跡がありませんでした。
>これはPASVモードになっているのでしょうか?

サーバは少なくともPassiveモードしかサポートしていないようです。なので、サーバからクライアントの20/TCPにはコネクションを張らずに、21/TCPでクライアントからのPASVコマンド待ちです。PASVコマンドがクライアントから来れば、21/TCPでEntering Passive Mode (X,X,X,X,A,B)を返しますので、クライアントはサーバの(A*256+B)/TCPポートに対してSYNを送信、所謂3ウェイハンドシェイクでデータセションが繋がるという流れになります。

>FFFTPで繋いでいて拡張オプションのPASVモードにチェックをつけていないのでpassiveモードではないはずですが、

クライアントソフトはActive FTPで接続しようとしているのは間違いないですね。

>WireSharkで見たところ、後ろにPASVと書かれていました。
>Wireshark結果
>3967 345.551600000 52.27.XX.XXX 192.168.0.4 FTP 105 Response: 200 PORT command> successful. Consider using PASV. ← パッシブモードになっている?

良く読んで下さい。単に「Passiveモードでの使用を検討して下さい」というメッ...続きを読む

QFTPコマンドでディレクトリごとファイル移動できるコマンドはありますか?

タイトルどおりなのですが、FTPでファイルを転送する際に、サブフォルダを含むディレクトリごとファイル転送するコマンドはありますでしょうか。
ディレクトリの中にあるすべてのファイルを移動したいのですが、サブフォルダがたくさんあるので、わざわざディレクトリの場所へ移動してmputを繰り返すのはめんどうで仕方ありません。
よろしくお願いします。

Aベストアンサー

ご使用になるOS環境が書いてないのですが、Linux,BSD等ならncftpで、get -R dir。
Windowsならffftpを使えば良いと思います。

QVB2008でFTPでのディレクトリー存在確認のやり方が分からない。

VB2008でFTP転送のブログラムを組んでいるのですが、ディレクトリーの存在確認のところで詰まっています。
ネット検索を行うと、下記記述が幾つか出てきますが、使い方、記述方法が分かりません。

if文を使い、FALSE か TRUEかで確認を行いたいと思っております。

ご存じの方がいらっしゃいましたらご教授下さいませ。
当方は初心者です。
宜しく御願い致します。

WebRequestMethods.Ftp.ListDirectory
WebRequestMethods.Ftp.ListDirectoryDetails

Aベストアンサー

一応、確認ですけど、FTPサーバー側のディレクトリ有無確認ですよね?
Directory.Exists(xxx) みたいのは無いんですねー

で、ちょっと調べてみましたが、@iITさんのところによさげなサンプルコードがありました。(大分下の方です。)
http://www.atmarkit.co.jp/fdotnet/dotnettips/763ftpdirexists/ftpdirexists.html

Qsocket: recvはいつ,どれだけ受け取るのか?

 現在,参考書にしたがってC++でソケットプログラミングを書いています.

 sendとrecvを非同期にするために,本では select関数やWSAAsyncSelect関数などを利用していて,実際,本のとおりに書いて上手く動いています.

 ここで伺いたいのですが,recvは,どうやって「データが届いたか」を知るのでしょうか.

 同期ならば,トランシーバでの会話のように送信側が「どうぞ」といって送受信を交代させることができますが,非同期ならばそれができません.

 NICとかが,プログラムに「届いたぞ!( or これから届くぞ!)」と教えてくれるのでしょうか.あるいは逆に,プログラムがNICに「届いてる?」と聞いているのでしょうか.仮に,ここに書いたような方法で届いたことが分かったとしても,どれくらい受け取ればいいかは分かりません(それも併せて教えてもらっているのでしょうか.データを送るときには,どれだけ送ればいいか分かりますよね.受信するときはどうしてるのかを知りたいと思っています).

Aベストアンサー

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満たされると、この場合は select() や read() が、抜けてくる(return する)訳です。

という事で、ユーザのプログラムは select() なり read() なりで受信データを「待つ」ことが必要です。もちろん select() や read() が呼ばれた時点で既に受信しているのならば、それらは直ぐに帰ってきます。read() や recv() はデータが届いた事を知る、というよりは、届いているかチェックして、まだ届いていなければ届くまで待つ(read() が抜けてこない)という処理になります。また NIC とユーザプログラムが直接やり取りをするのではなく、間にバッファがあって、対応するソケットのデータがある(受信済み)/ないか(未受信)、という問い合わせを行っているだけです。

ソケットの場合、データの送受信は非同期であり、送受信のタイミングのずれは(ソケット)バッファである程度吸収されます。もちろん、送受信バッファが満杯になった場合は流量制御が働いて、結果的に送信側の write() や send() が待ちに入ることになります。

Linux (Unix) のソケットの受信では、read() 等で指定されたバッファが常に満杯で返されるとは限らない設計になっています。つまり、その時に受信しているデータを返すだけなので、read() で返されたバイト数を必ず見ないと間違った動きになるので注意してください。

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満...続きを読む

QCの関数で自分自身のパス取得

関数で現在実行しているファイルのパスを取得するものがあると聞いたことがあるんですが、見当もつかないです。
知ってる方がいたら教えてください。

お願いいたします

Aベストアンサー

Windowsの場合でしたら

GetModuleFileName

で第一引数にNULLを指定すれば自分のファイルパス(ファイル名含む)まで
取得できます。

Q「memcpy」と「strcpy」について

C言語の初心者です。
先日、課題として以下のようなことを言われました。

「memcpyとstrcpyについて、メモリ破壊が起こるとしたら
どんな場合が考えられるか、簡単にまとめて報告してみて下さい。」
と言われました。

私にはメモリ破壊というニュアンスが分からないのですが、
どちらの関数も必要以上にコピーを行ったときに
起こるメモリ破壊ということなのでしょうか?
それとも、何か特別な意味があるのでしょうか?

C言語に詳しい方がいましたら、是非、教えて下さい。
宜しくお願いします。

Aベストアンサー

 メモリ破壊とは、「当然そこに入っているべき値」を、不用意に上書きしてしまうことです。

 たとえば、char a[100]; という宣言をしたとします。

 memcpy( a, 0, 200 );

 すると、このような実行を行った場合、変数 a の後ろにどんなメモリが存在しているのかプログラマは知ることができないのに、変数 a の後ろの未定メモリ100バイトを上書きしてしまいます。

 この未定メモリには、もしかしたら別の変数があるかもしれませんし、プログラムの一部があるかもしれません。あるいはOSのシステム領域かもしれません。
 どのみちプログラムは正常に動かなくなります。
 通常はメモリエラーが出て停止しますが、最悪の場合、メモリ上のOSを破壊してリセットするしかなくなったりもします。

 これがメモリ破壊です。


人気Q&Aランキング