C言語関係掲示板

過去ログ

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

[戻る] [ホームページ]
No.18

ftpクライアントでの接続後の、サーバ側のファイル一覧の取得方法
投稿者---juju(2003/05/20 10:17:00)


c言語で、ftpプロトコルを使用し、ftpサーバまで接続することができたまでは良かったのですが、サーバ側のファイル一覧を取得する記述部分が分かりません。

現在は、データ用のsocketを作成し、bind、listen、accept、ファイル一覧(read)表示順に記述していますが、動作しておりません。
ソースは以下のとおりです。

date_socket = socket(AF_INET, SOCK_STREAM, 0);

sin.sin_family = AF_INET;
sin.sin_port = 0;
sin.sin_addr.s_addr = htonl(INADDR_ANY);

if ( bind(data_waiting_socket, (struct sockaddr *)&sin, sizeof sin) < 0 ){
 error("bind failed.\n");
}

if ( listen(data_waiting_socket, SOMAXCONN) == -1 ){
 error("listen failed.\n");
}

len = sizeof(sin);
data = accept(data_socket, (struct sockaddr *)&sin, &len);
if ( data == -1 ){
 error("accept failed.\n");
}

while (1){
 int read_size;
 read_size = read(data_socket, buf, BUF_LEN);
 if ( read_size > 0 ){
  ??
 }
}

No.19

Re:ftpクライアントでの接続後の、サーバ側のファイル一覧の取得方法
投稿者---shelly(2003/05/20 10:38:46)


FTPクライアントを作ろうとしているんですよね?
サーバにconnectしている部分が見当たりませんが。。。

このソースでは0番ポートを使用したサーバプログラムに
なってしまう?



No.20

Re:ftpクライアントでの接続後の、サーバ側のファイル一覧の取得方法
投稿者---juju(2003/05/20 11:25:43)


>FTPクライアントを作ろうとしているんですよね?
>サーバにconnectしている部分が見当たりませんが。。。
>
>このソースでは0番ポートを使用したサーバプログラムに
>なってしまう?
>

すみません。
if((command_socket = socket(AF_INET, SOCK_STREAM, 0)) > 0){

 /* サーバに接続 */
 connect(command_socket, (struct sockaddr *)&server, sizeof(server));

 /* welcome response を取得 */
read_response(command_socket, buf);
/* USER・PASS を送信 */
sprintf(send_mesg, "USER %s\n", user);
write_to_server(command_socket, send_mesg);
read_response(command_socket, buf);

sprintf(send_mesg, "PASS %s\n", passwd);
write_to_server(command_socket, send_mesg);
read_response(command_socket, buf);

を記入しておりませんでした。
この部分は、サーバ側で接続が確認されましたので、必要ないのかと思い、
省いたのですが、間違いだったでしょうか。

>このソースでは0番ポートを使用したサーバプログラムに
>なってしまう?
ということは、サーバ側のポート番号を割り出して、代入すればよろしいのでしょうか?

No.22

Re:ftpクライアントでの接続後の、サーバ側のファイル一覧の取得方法
投稿者---かずま(2003/05/20 11:41:46)


> /* USER・PASS を送信 */
> sprintf(send_mesg, "USER %s\n", user);
> write_to_server(command_socket, send_mesg);
> read_response(command_socket, buf);
>
> sprintf(send_mesg, "PASS %s\n", passwd);
> write_to_server(command_socket, send_mesg);
> read_response(command_socket, buf);
>
>を記入しておりませんでした。

私がコメントを書いている間に、追加情報が。
失礼しました。


No.24

Re:ftpクライアントでの接続後の、サーバ側のファイル一覧の取得方法
投稿者---juju(2003/05/20 15:40:20)


>> /* USER・PASS を送信 */
>> sprintf(send_mesg, "USER %s\n", user);
>> write_to_server(command_socket, send_mesg);
>> read_response(command_socket, buf);
>>
>> sprintf(send_mesg, "PASS %s\n", passwd);
>> write_to_server(command_socket, send_mesg);
>> read_response(command_socket, buf);
>>
>>を記入しておりませんでした。
>
>私がコメントを書いている間に、追加情報が。
>失礼しました。

いえ、記述しておりませんでした私のミスです。
ただ、telnet -d IP 21 で一度コマンドでログインしたのですが、
CWD、PWDなどは問題なく動作いたしますが、LISTなどを入力しましても、

150 Opening ASCII NO-PRINT mode data connection for ls -l.
426 Data connection error. Connection closed. Transfer aborted

というエラーが表示され、一覧が表示されません。
これはデータ用のコネクションを接続していないからでしょうか?


No.25

Re:ftpクライアントでの接続後の、サーバ側のファイル一覧の取得方法
投稿者---shelly(2003/05/20 18:33:23)


>150 Opening ASCII NO-PRINT mode data connection for ls -l.
>426 Data connection error. Connection closed. Transfer aborted
>
>というエラーが表示され、一覧が表示されません。
>これはデータ用のコネクションを接続していないからでしょうか?

そうですね。エラーメッセージの通り、データ用のコネクションがないから
エラーになっているんでしょう。
僕もFTPクライアントは書いたことは無いんですが、
コマンド送信用のsocketと、データを受け取るソケットの二つが必要になります。
あいてるポートを探し、PORTコマンドを使用します。
PASVもありますね。
僕自身よく知らないので、申し訳ないんですが。。。
進展を期待しています。

No.21

Re:ftpクライアントでの接続後の、サーバ側のファイル一覧の取得方法
投稿者---かずま(2003/05/20 11:35:17)


> このソースでは0番ポートを使用したサーバプログラムに
> なってしまう?

そうですね。それに、
date_socket = socket(...) なのに、bind(data_waiting_socket, ...)
とても、「c言語で、ftpプロトコルを使用し、ftpサーバまで接続することが
できたまでは良かったのですが、」が本当のこととは思えません。

それに ftp プロトコルで接続するということは、USER や PASS などの
コマンドを送信しないといけないし、、コントロールとデータの 2つの
コネクションが必要ということが分かっているのでしょうか。

サーバ側のファイル一覧は LISTコマンドだったと思うんですが、
とにかく、ftp の RFC をよく読むことと、それ以前にネットワーク
プログラミングを基礎からやり直さないと、プログラムは作れないのでは
ないのでしょうか。