[kansaipm] Re: 始めまして
mishima at momo.so-net.ne.jp
mishima at momo.so-net.ne.jp
Sat Jun 24 13:11:24 CDT 2000
三嶋です。こんにちは。
From: 片松 祐司 <yuji.katamatsu at toppan.co.jp>
Subject: [kansaipm] 始めまして
Date: Thu, 22 Jun 2000 19:00:38 +0900
> で、このメールの最後にあるソースを、DOS窓で走らせて、
> IEで127.0.0.1にアクセスさせます。
>
> DOS窓でHTTPのリクエストを読み込んで表示、
> その後"HTTP/1.1 204"を返してブラウザはそのまま
>
> という動作を期待していました。
>
> ところが、最初の一行
> GET…しか読めません。
> どうしてなのか教えていただきたいのです。
最初に <$fh> を使用した時点で、クライアントからのデータが
高水準入出力用の入力バッファ(こんな言い方でわかる? 正式な
用語はよく知らないの)に一気に読み込まれて、ソケットが空に
なってしまってるんじゃないでしょうか?
クライアントからのリクエストデータなんか、どうせすぐ届くので
空行を読むまで単純に while( $read = <$fh> ) でループしては
どうでしょうか。
ついでに言うと、IO::Socket::INET->new の引数で、=> と書くべき
ところが軒並み = になっていたようです。
(変更後のソース)
use IO::Socket;
use IO::Select;
$sv_port=80;
$lsn = IO::Socket::INET->new(
LocalAddr =>'localhost',
LocalPort =>$sv_port,
Proto =>'tcp',
Listen =>1,
Reuse =>1,
);
$sel = IO::Select->new($lsn);
while(1) {
if (@active = $sel->can_read(1)) {
foreach $fh (@active) {
if ($fh eq $lsn) {
$new = $lsn->accept;
$sel->add($new);
}
else {
while( $read = <$fh> ){
print $read;
last unless $read =~ /\S/;
}
print $fh "HTTP/1.1 204 NoDocuments\n\n";
$fh->flush();
$sel->remove($fh);
$fh->close;
}
}
}
}
More information about the Kansai-pm
mailing list