[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