use strict;
use warnings;
use IO::Socket;

my $pinghost = '';
$| = 1;

foreach $pinghost (@ARGV)
  { portscan($pinghost, 1, 1024); }


sub portscan  # ($hostip, $lowport, $highport)
  {
  my $port = 0;
  my $iaddr = 0;
  my $paddr = 0;
  my $connect_time = 1;
  my $protocol_name = "tcp";
  my $protocol_id = getprotobyname($protocol_name);
  my $hostip = shift;
  my $lowport = shift;
  my $highport = shift;

  print "Portscan von $hostip.\n";
  for $port ($lowport .. $highport)
    {
    print "\n  Port $port: ";
    $SIG{"ALRM"} = sub { close(SOCKET); };
    alarm $connect_time;

    socket(SOCKET, PF_INET, SOCK_STREAM, $protocol_id);

    $iaddr  = inet_aton($hostip);
    $paddr  = sockaddr_in($port, $iaddr);

    print "offen!" if (connect(SOCKET, $paddr));
    close(SOCKET);
    }
  }
