our @servers; our $server_fdset = ''; # Fill in the IP addresses/names of all of the servers sub setup { for my $server (@servers) { $server->{socket} = IO::Socket::INET->new(Proto => 'tcp', PeerAddr => "$server->{host}:$server->{port}") or die "connection to server $server->{name}\n"; # In reality, you should do something smarter if a server fails -- return an incomplete result, or have redundant servers vec($server_fdset, fileno($server->{socket}), 1) = 1; } } sub query { my ($what) = @_; for my $server (@servers) { $server->{socket}->syswrite("how many $what you got, dude"); } my $num_bananas = 0; my $done = 0; my $fds = $server_fdset; while ($done < @servers) { my $rfds; select($rfds = $fds, undef, undef, undef); for my $server (@servers) { if (vec($rfds, fileno($server->{socket}), 1)) { my $buf; $server->{socket}->sysread($buf, 4); my $result; unpack("L", $buf); $num_bananas += $result; # Done with this server $done++; vec($fds, fileno($server->{socket}), 1) = 0; } } } # Repeat, using the new request }