Deprecated: The each() function is deprecated. This message will be suppressed on further calls in /home/zhenxiangba/zhenxiangba.com/public_html/phproxy-improved-master/index.php on line 456
#!/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--; # 残りソケット数を減らす
}
}
}