#!/usr/bin/perl use warnings; use strict; package IPToolCollection; use IO::Socket; use Thread; #-----------------------------------------------------------------------# # subroutines # #-----------------------------------------------------------------------# sub scanPorts() { our ($remoteHost, $protocol, $startPort, $stopPort) = @_; my %portStatusH = (); sub scanSinglePort() { my $remotePort = shift; my $portStatusB = "open"; my $socket = new IO::Socket::INET ( PeerAddr => $remoteHost, PeerPort => $remotePort, Proto => $protocol, Type => SOCK_STREAM ); $portStatusB = "closed" if(!defined($socket)); return ($remotePort,$portStatusB); } for my $i ($startPort..$stopPort) { my $scanPortThread = Thread->new ( \&scanSinglePort,$i ); } for my $t (Thread->list()) { my ($port, $portStatusB) = $t->join(); $portStatusH{$port} = $portStatusB; } return %portStatusH; } #-----------------------------------------------------------------------# # main script # #-----------------------------------------------------------------------# my %resultH = &scanPorts("127.0.0.1", "TCP", 0, 100); while(my ($k,$val) = each(%resultH)) { print "port $k is $val \n"; }