Is this modern enough for you? ;-)
use v6;
port_check( ['perlmonks.com', 'fail.com', 'perlmonks.org'], 22 );
sub port_check( @nodes, $port )
{
my @promises = @nodes.map( -> $host {
IO::Socket::Async.connect( $host, $port )
});
await Promise.allof( @promises );
for @nodes Z @promises -> [$node, $promise]
{
if $promise.status ~~ Kept
{
given $promise.result
{
my $peer = "{.peer-host}:{.peer-port}";
my $socket = "{.socket-host}:{.socket-port}";
say "$socket connected to $peer";
.close;
}
}
else
{
say "not connected to $node:$port";
}
}
}
D:\ENV>perl6 pcheck.pl
192.168.178.20:49859 connected to 216.92.34.251:22
not connected to fail.com:22
192.168.178.20:49861 connected to 209.197.123.153:22
Edit:
This is the same code with a custom timeout.
use v6;
port_check( ['perlmonks.com', 'fail.com', 'fail.com', 'fail.com', 'fai
+l.com', 'fail.com', 'fail.com', 'fail.com', 'perlmonks.org'], 55, 2 )
+;
sub port_check( @nodes, $port = 22, $timeout = 10)
{
my @promises = @nodes.map( -> $host {
IO::Socket::Async.connect( $host, $port );
});
my @waits = @promises.map( -> $promise {
Promise.anyof( Promise.in( $timeout ), $promise )
});
await Promise.allof( @waits );
for @nodes Z @promises -> [$node, $promise]
{
if $promise.status ~~ Kept
{
given $promise.result
{
my $peer = "{.peer-host}:{.peer-port}";
my $socket = "{.socket-host}:{.socket-port}";
say "$socket connected to $peer";
.close;
}
}
else
{
say "not connected to $node:$port";
}
}
}
holli
You can lead your users to water, but alas, you cannot drown them.