in reply to alarm not working on windows machine

alarm works on windows; but it will not interrupt pending IO.

The simplest solution is to use IO::Select::canRead() something like this:

#!perl -w use strict; use IO::Socket::INET; use IO::Select; my $channel_id = open_channel("127.0.0.1", "7777"); sub open_channel { # create a connecting socket my $host = shift; my $port = shift; my $timeout = 5; if ( $host !~ m/(\d+)\.(\d+)\.(\d+).(\d+)/i ) { print "IP Address:'$host' is not a Valid IP-Address."; return 139; } my $socket = new IO::Socket::INET ( PeerHost => $host, PeerPort => $port, Proto => 'tcp', ); die "cannot connect to the server $!\n" unless $socket; my $sel = IO::Socket->new( $socket ); if ( !defined $socket ) { print "Opening TCP Channel to host: $host and Port: $port Fail +ed !!"; return 138; } else { $socket->send("Check Connectivity"); while (1) { my @ready = $sel->can_read( $timeout ) or do{ print "=> Time-Out as no data received for '$timeo +ut sec'.!!\n"; last; }; my $recieved_data= <$socket>; if ( defined $recieved_data ) { chomp($recieved_data); if ($recieved_data =~ /Connected to TCP socket server/ +i){ print "TCP Connection established with Channel id: + '$socket'\n"; return $socket; } else{ print "Cannot craete connection with server\n"; return 137; } } } $socket->close(); } }

With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.

Replies are listed 'Best First'.
Re^2: alarm not working on windows machine
by Rahul Gupta (Sexton) on Oct 19, 2013 at 09:49 UTC

    Thanks for you reply.

    while executing your code i am getting this error.

    Odd number of elements in hash assignment at C:/Perl/lib/IO/Socket.pm +line 41. IO::Socket: Cannot configure a generic socket at test.pl line 25

    and when i changed

     my $sel = IO::Socket->new( $socket ); with  my $sel = IO::Socket::INET->new( $socket );

    then getting this error

    Can't call method "can_read" on an undefined value at test.pl line 35.

      My typo. This: my $sel = IO::Socket->new( $socket ); should have been: my $sel = IO::Select->new( $socket );.

      Try this:

      #!perl -w use strict; use IO::Socket::INET; use IO::Select; my $channel_id = open_channel("127.0.0.1", "7777"); sub open_channel { # create a connecting socket my $host = shift; my $port = shift; my $timeout = 5; if ( $host !~ m/(\d+)\.(\d+)\.(\d+).(\d+)/i ) { print "IP Address:'$host' is not a Valid IP-Address."; return 139; } my $socket = new IO::Socket::INET ( PeerHost => $host, PeerPort => $port, Proto => 'tcp', ); die "cannot connect to the server $!\n" unless $socket; my $sel = IO::Select->new( $socket ); if ( !defined $socket ) { print "Opening TCP Channel to host: $host and Port: $port Fail +ed !!"; return 138; } else { $socket->send("Check Connectivity"); while (1) { my @ready = $sel->can_read( $timeout ) or do{ print "=> Time-Out as no data received for '$timeo +ut sec'.!!\n"; last; }; my $recieved_data= <$socket>; if ( defined $recieved_data ) { chomp($recieved_data); if ($recieved_data =~ /Connected to TCP socket server/ +i){ print "TCP Connection established with Channel id: + '$socket'\n"; return $socket; } else{ print "Cannot craete connection with server\n"; return 137; } } } $socket->close(); } }

      Note: this is still untested code. The idea is that you should look at the docs for IO::Select and try to understand what the above code is suggesting.


      With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.

        Thanks for your reply..

        This is working fine... but when i am giving any other Linux command. for example if i replace $socket->send("Check Connectivity"); with $socket->send("ls -l \n");.

        i am not getting any response from server side.

        please help me how can i do so.
        Thanks in advance