maxon has asked for the wisdom of the Perl Monks concerning the following question:

Hi,

Timeout => 0, or die "Coudn't open socket port $port\n" unless $socket +;

Replies are listed 'Best First'.
Re: Skip timeout host on IO::Socket
by zentara (Cardinal) on Nov 11, 2018 at 14:52 UTC
    See Perl Sockets and look at the use of "select" and "forking" in the different replies. Here is a basic example of using select and detecting disconnects.

    A server

    #!/usr/bin/perl use IO::Socket; use IO::Select; my @sockets; my $machine_addr = 'localhost'; $main_sock = new IO::Socket::INET(LocalAddr=>$machine_addr, LocalPort=>1200, Proto=>'tcp', Listen=>3, Reuse=>1, ); die "Could not connect: $!" unless $main_sock; print "Starting Server\n"; $readable_handles = new IO::Select(); $readable_handles->add($main_sock); while (1) { ($new_readable) = IO::Select->select($readable_handles, undef, undef +, 0); foreach $sock (@$new_readable) { if ($sock == $main_sock) { $new_sock = $sock->accept(); $readable_handles->add($new_sock); } else { $buf = <$sock>; if ($buf) { print "$buf\n"; my @sockets = $readable_handles->can_write(); #print $sock "You sent $buf\n"; foreach my $sck(@sockets){print $sck "$buf\n";} } else { $readable_handles->remove($sock); close($sock); } } } } print "Terminating Server\n"; close $main_sock; getc();

    A general purpose forking client

    #!/usr/bin/perl -w use strict; use IO::Socket; my ( $host, $port, $kidpid, $handle, $line ); ( $host, $port ) = ('localhost',1200); my $name = shift || ''; if($name eq ''){print "What's your name?\n"} chomp ($name = <>); # create a tcp connection to the specified host and port $handle = IO::Socket::INET->new( Proto => "tcp", PeerAddr => $host, PeerPort => $port ) or die "can't connect to port $port on $host: $!"; $handle->autoflush(1); # so output gets there right away print STDERR "[Connected to $host:$port]\n"; # split the program into two processes, identical twins die "can't fork: $!" unless defined( $kidpid = fork() ); # the if{} block runs only in the parent process if ($kidpid) { # copy the socket to standard output while ( defined( $line = <$handle> ) ) { print STDOUT $line; } kill( "TERM", $kidpid ); # send SIGTERM to child } # the else{} block runs only in the child process else { # copy standard input to the socket while ( defined( $line = <STDIN> ) ) { print $handle "$name->$line"; } }

    I'm not really a human, but I play one on earth. ..... an animated JAPH
Re: Skip timeout host on IO::Socket
by hippo (Archbishop) on Nov 11, 2018 at 14:43 UTC

    Hello maxon. You wrote:

    What i'm creating here is client connect to all server from listarray then back to the first element

    You have not shown this loop. Without seeing that it's going to be difficult to go into specifics. However, if you do literally want to remove an element from an arbitrary position in an array, splice is the tool to use.

    Note that you've declared $socket twice and $port not at all. The lack of a consistent indentation scheme does not help the readability or maintainability of this code either; you can apply one automatically with perltidy.

    Good luck.