in reply to Detecting a port "in use" on localhost:$port

The following works for me, without timeouts, on both Linux and Windows XP SP2 and ActiveState perl 5.10.0:

use strict; use warnings; use Socket; my $host = 'localhost'; my $port = shift || '8888'; my $timeout = 30; my $result = portAlive(); print "result = $result\n"; sub portAlive { my $proto = getprotobyname('tcp'); my $iaddr = inet_aton($host); my $paddr = sockaddr_in($port, $iaddr); socket(SOCKET, PF_INET, SOCK_STREAM, $proto) || warn "socket: $!"; eval { local $SIG{ALRM} = sub { die "timeout" }; alarm($timeout); connect(SOCKET, $paddr) || error(); alarm(0); }; if ($@) { close SOCKET || warn "close: $!"; # print "$hostname is NOT listening on tcp port $portnumber.\n"; return 0; } else { close SOCKET || warn "close: $!"; # print "$hostname is listening on tcp port $portnumber.\n"; return 1; } }

The code you posted is incomplete. Is it possible that your problem is elsewhere in your code?

Replies are listed 'Best First'.
Re^2: Detecting a port "in use" on localhost:$port
by freddo411 (Chaplain) on Apr 22, 2009 at 01:51 UTC
    Interesting. The failure is triggered outside of portAlive. The code below added calling portAlive() gives the error on Win2003 perl 5.10. Note that the service is an ordinary windows service, not actually doing anything on that port.
    use strict; use warnings; use Socket; my $host = 'localhost'; my $port = shift || '8888'; my $timeout = 3; my $result = portAlive( 'localhost', 8888); print "result = $result\n"; print `net start "CONTENTdm Monitor 9998"`; exit;

    -------------------------------------
    Nothing is too wonderful to be true
    -- Michael Faraday