#!/usr/local/bin/perl # $Id: http-client-parallel.pl,v 1.4 2005/09/03 21:23:21 68user Exp $ use IO::Socket; use IO::Select; # 以下のサーバの web トップページを取得する my @servers = qw(www.goo.ne.jp www.yahoo.co.jp www.asahi.com); my $port = 80; my $selecter = IO::Select->new; # select の前準備 foreach my $server (@servers){ my $sock = IO::Socket::INET->new("$server:$port"); # 各サーバのソケットを生成 $selecter->add($sock); # select の対象ソケットに追加 $sock2host{$sock} = "$server:$port"; # メッセージ表示用ハッシュ print $sock "GET / HTTP/1.0\r\n"; # データの送信 print $sock "Host: $server:$port\r\n"; print $sock "\r\n"; $sock->flush(); # バッファをフラッシュ } # 読み込むべきデータが残っているソケット数。初期値はサーバ数と同じ my $last_sock = $#servers+1; # 読み込みが完了していないソケットが残っていたら while ( $last_sock > 0 ){ my ($readable_socks) = IO::Select->select($selecter, undef, undef, undef); # 読み込み可能なソケットがあれば、以下の foreach ループが実行される foreach my $sock (@$readable_socks){ my $len = sysread($sock, $buf, 4096); # ソケットから 4096 バイト読み込む if ( $len > 0 ){ # 1バイト以上読み込めた # 読み込んだ内容を整形して表示 $buf =~ s/^(.{20}).*/$1/s; # 先頭 20バイト以降を捨てる $buf =~ s/^/ /mg; # 先頭にスペースを挿入 $buf =~ s/[\r\n]//g; # 改行コードを省く print "read ${len}bytes from $sock2host{$sock} $buf....\n"; } else { # 1バイトも読み込めなかった print "fin $sock2host{$sock}\n"; # そのソケットからの読み込みは終了 $selecter->remove($sock); # select の対象から外す $sock->close(); # ソケットをクローズ $last_sock--; # 残りソケット数を減らす } } }