Hi,
I've used the following two subs successfully on Win32 but they were
written to be cross platform and I think they should work.
used as
my $newport = get_next_free_local_port(9000);
gets the next free port starting from 9000.
sub local_port_is_free {
my ($portnumber) = @_;
my $proto = getprotobyname('tcp');
my $iaddr = inet_aton('localhost');
my $timeout = 5;
my $freeport = 0;
my $paddr = sockaddr_in($portnumber, $iaddr);
socket(SOCKET, PF_INET, SOCK_STREAM, $proto);
eval {
local $SIG{ALRM} = sub { die "timeout" };
alarm($timeout);
connect(SOCKET, $paddr) || error();
};
if ($@) {
eval {close SOCKET; };
$freeport = $portnumber;
} else {
eval {close SOCKET; };
}
alarm(0);
return $freeport;
}
sub get_next_free_local_port {
my ($startport) = @_;
my $freeport = 0;
my $tryport = $startport;
while(not $freeport = local_port_is_free($tryport) ) {
$tryport ++;
die("Cannot find free port") if $tryport > ($startport + 100);
}
return $freeport;
}
On 01/11/2010 19:42, Edwards, Mark (CXO) wrote:
> I thought of something like that but would rather implement it using some
> kind of Perl socket routine. I'll be using this on Windows and different
> flavors of Unix and the output format of netstat differs.
>
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Brian
> Raven
> Sent: Monday, November 01, 2010 5:07 AM
> To: [email protected]
> Subject: RE: Checking for Available Port
>
> Edwards, Mark (CXO)<> wrote:
>> I'm writing a simple port listener script using
>>
>> $local=IO::Socket::INET->new(Proto=>"tcp",
>> LocalPort=>$port,
>> Listen=>1,
>> Reuse=>1,) or die "Can't open listening port: $!\n";
>>
>> Everything works fine except I want to check to see if the port is
>> available before I try to open it. In some cases, if the machine is
>> already listening on a port, the script dies as expected. In other
>> cases the script runs but isn't really listening. Sometimes it takes
>> over a LISTENING port. I want to check for LISTENING or ESTABLISHED
>> ports.
>
> Use something like `netstat -na`. For example:
>
> sub tcp_port_state {
> my $port_to_check = shift;
> foreach (`netstat -na`) {
> next unless /tcp/i;
> my ($proto, $local, $remote, $state) = split;
> my ($ip, $port) = split /:/, $local;
> if ($port == $port_to_check) {
> return $state;
> }
> }
> return "NOT IN USE";
> }
>
> HTH
>
_______________________________________________
Perl-Win32-Users mailing list
[email protected]
To unsubscribe: http://listserv.ActiveState.com/mailman/mysubs