my $SOCK; sub main_connection { my $text = shift;#prompt-msg sleep(30) unless $FST;#provide serverflooding $FST = 0; print "$text\n"; $SOCK = shake_hands(); login(); #use select to have a non-blocking socket my $sock = new IO::Select( $SOCK ); main_loop($sock); } #sub main_connection sub main_loop { my $sock = shift; my $died = 0;#check flag while (1) { #get data from socket, if there some while ((my @ready = $sock->can_read(240))) { for my $fh (@ready) {#checkout readable fhs if($fh == $SOCK) { my $input; unless(sysread($SOCK,$input,2048)) { $died = 1 }; last if $died; if($input) { ping_check(); #in some cases we've more than one cmd in a line #so we've to split them by \n, cause server seperates by \n my @cmds = split /\n/, $input; for my $line (@cmds) { open_log() unless check_log("logs/$logfile"); start($line); } } else { print "unknow socketerror...\n";#syswrite returns 1, but we haven't some input? } last; } } last if $died; } last if $died; ping_check() or last; print "Nichts passiert!\n"; } $sock = main_connection('Socketerror, trying to reconnect..'); main_loop($sock); } #main_loop() sub shake_hands { my $host = 'www.example.com'; my $port = '0000'; #open socket to chatserver my $socket = IO::Socket::INET->new( PeerAddr => $host, PeerPort => $port, proto => 'tcp', type => 'SOCK_STREAM', Timeout => 20); main_connection("No Network! Relogin..") unless $socket; return $socket; } #sub shake_hands