68user様 突然掲示板に書き込む無礼をお許しください。 私はネットワークの勉強をし始めたばかりの薩摩という者です。 こちらのページは大変奥深く、いつきても感動してしまいます。 ところで、今回意を決して掲示板に書き込むことに決めたのは、 ftptransのforkの部分を4引数selectを用いたらどうなるかを 知りたかったためです。 自分で考えてみたのですが、ソースが汚くなってしまい、 もし68user様ならどのように書かれるのか気になって しまったのです。本当ならこういうソースはメール等で お送りすべきとは思うのですが、こちらの方でするように とありましたので、いかに書きます。なお、ftptrans内で 用いられているサブルーチンはそのまま使わせて頂きました。 if ($passive){ &client_work(DATA,$data_connection_host,$data_connection_port); } $rin = &set_bits(COMMAND,DATA,DATA_WAITING); while(1){ $ret = select($rout=$rin,undef,undef,undef); if(fileno(COMMAND) && vec($rout,fileno(COMMAND),1)){ $ret = &read_response; if ( $ret =~ m/^5/ ){ print STDERR $ret; close(DATA); close(DATA_WAITING); exit; }elsif( $ret =~ m/^1/ ){ if ($mode eq put){ open(IN,$infile) || die "$infile: $!"; while (<IN>){ print DATA $_; } close(IN); } }elsif( $ret =~ m/^2/ ){ close(DATA); } }elsif(fileno(DATA_WAITING) && vec($rout,fileno(DATA_WAITING),1)){ accept(DATA,DATA_WAITING); $rin = &set_bits(COMMAND,DATA,DATA_WAITING); close(DATA_WAITING); }elsif(fileno(DATA) && vec($rout,fileno(DATA),1)){ open(OUT,">$outfile") || die "$outfile: $!"; print OUT <DATA>; close(OUT); close(DATA); exit; } } sub set_bits { @sockets = @_; $rin=""; foreach $sock (@sockets){ if(fileno($sock)){ vec($rin,fileno($sock),1)=1; } } return $rin; } sub to_bin { return unpack "B*",$_[0]; } 以上です。投稿が非常に長くなってしまいましたが、 気付いた点がありましたら御指摘いただけると幸いです。 また、68user様がかかれた物も拝見できましたら ありがたいのですが。 以上、よろしくお願いします。 |