プログラム (Perlサーバ)

#!/usr/local/bin/perl
#
#	Perlによる単純辞書サーバ
#
require 'clientserver.pl';

%clientsock = ();
$fhtemplate = 'FH000';

&serveropen(5678,'INITSOCK');

$SIG{'INT'} = 'finish';
sub finish { $finish = 1; }

&dicread; 

for(;;){ # サーバの無限ループ
	last if $finish;
	$bits = '';
	vec($bits,fileno(INITSOCK),1) = 1;
	for(keys %clientsock){
		vec($bits,fileno($_),1) = 1;
	}
	if(select($obits=$bits,'','',100)){
		if(vec($obits,fileno(INITSOCK),1)){ # 接続要求
			$fh = $fhtemplate++;
			accept($fh,INITSOCK) || die $!;
			select($fh); $| = 1; select(stdout);
			$clientsock{$fh} = 1;
		}
		for $fh (keys %clientsock){
			if(vec($obits,fileno($fh),1)){ # クライアント要求
				$_ = <$fh>;
				if($_ eq ''){ # 接続終了要求
					close($fh);
					delete $clientsock{$fh};
				}
				else {
					chop;
					&client_request($fh,$_);
				}
			}
		}
	}
}

sub client_request {
	local($fh,$req) = @_;
	local($s);
	&lookup($req);
	$s = '';
	for $i (@match){
		$s .= "$e[$i]\t$j[$i]\r";
	}
	print $fh "$s\n";
}

sub dicread { # #1と同じ
sub lookup { # #1と同じ