use strict; use warnings; use IO::Socket; use sigtrap qw/handler signal_handler normal-signals/; use constant SERVER => 'dns'; use constant PORT => 31416; my $EOL = "\015\012"; my $SENTINEL = '.' . $EOL; die 'Which machine do you want to wake?' unless scalar @ARGV; my $socket = IO::Socket::INET->new( Proto => 'tcp', # protocol PeerAddr => SERVER, # Address or name of server PeerPort => PORT, # port of server ) or die "Server <" . SERVER . "> not responding: <$!>"; $socket->autoflush(1); # Send immediately $socket->setsockopt( SOL_SOCKET, SO_LINGER, 0 ); while (@ARGV) { print $socket (shift @ARGV) . $EOL; # Send to Server while (my $res = <$socket>) { # Receive result from server last if ($res eq $SENTINEL); # Close if sentinel received print $res; # Print the result } } $socket->shutdown(2) or warn $!; sub signal_handler { close $socket or warn $!; }