68user's page 掲示板

Prev< No. 721> Next  [最新発言に戻る] [過去ログ一覧]
No. 721 # 68user [URL] [E-mail] 2000/02/12 (土) 09:19
> メリクリウスさん
メールの返事をここでさせて頂きますが、人の多いところから
リンクしちゃダメなのは、お肉さんのところです。うちは
どこからリンクしても構いませんです。


> FTPdが起動中はエクスプローラからもファイルの削除等ができません。
FTPd が STOR 先のファイルをオープンし続けているということですね。
謎ですね。

こちらには Windows 環境がないので、そのものずばりの答えは
わかりませんが、思いつくままに。

1. まずは小さなファイルでやってみて下さい。
2. sub client_work の最後で、SOCK のバッファリングを OFF にしている
   ($|=1) のは削ってませんよね?
3. QUIT 送信の前に &read_response(COMMAND) が一つ足りてないんじゃない
   ですか? データコネクションが確立したら、
    150 Binary data connection for test/hogemoge (127.0.0.1,33299).
   というレスポンス、さらに転送が完了したら
    226 Transfer complete.
   というレスポンスが返ってきませんか?
   (でもこれが原因じゃないと思う。レスポンスを読まなくても転送はできるはず)
4. $verbose=1 にして、プロトコル眺めてますよね?
5. passive なら、telnet コマンドだけを使って送信してみるのもいいかも。
6. ftp にデバッグオプションを付けて、プロトコルを観察してみては。

>> 1バイトずつ送ってみるとどうでしょう。
> えっと、具体的にどのようにすればいいんでしょうか?
例えばこんな感じです。
    &send_command("STOR $target_file\r\n");
    &client_work(DATA,$data_connection_host,$data_connection_port);
    &read_response(COMMAND);

    use IO::File;
    sysopen(IN,$infile,O_RDONLY);
    binmode(IN); # sysopen なら不要かな?
    while (1){
        $nread = sysread(IN,$buf,1);
        $read_size += $nread;
        last if ( $nread == 0 );
        print "$read_size read ";
        print DATA $buf || die "$!"; # 成功したかどうかチェック
        print "$read_size send.\n";
    }
    close(DATA); close(IN); &read_response(COMMAND);
    &send_command("QUIT$CRLF"); &read_response(COMMAND); close(COMMAND);
とりあえず、何バイト目でこけているのかは調べられるでしょう。
ただし、パケットレベルで 1バイトずつのデータが送られる、という
保証はありません。

念には念を入れて、print DATA の代わりに syswrite(DATA,...) を
使ってみるのもいいかも。
# syswrite = select(DATA);$|=1;binmode(DATA);print DATA と
# 同じはずだと思うんですが、違いましたっけ。


Solaris の ftpd 相手に試していて思ったんだけど、
    http://X68000.startshop.co.jp/~68user/net/ftp-5.html
> 次のアクションは
>  データコネクションの確立なのか
>  コマンドコネクションからのエラーレスポンスなのか
> のどちらなのかが わからないのです。
こんな変な仕様は、もしかして FreeBSD の ftpd だけかもしれない…。
調べておかねば。

Prev< No. 721> Next  [最新発言に戻る] [過去ログ一覧]