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"; } } }
Edit: This is the same code with a custom timeout.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
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"; } } }
In reply to Re: A question of fork efficiency
by holli
in thread A question of fork efficiency
by synless
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |