Beefy Boxes and Bandwidth Generously Provided by pair Networks
Just another Perl shrine
 
PerlMonks  

Re: Does IO::Select work? Solution

by zentara (Archbishop)
on Oct 24, 2012 at 12:58 UTC ( #1000629=note: print w/ replies, xml ) Need Help??


in reply to Does IO::Select work? Anywhere?

Hey BrowserUk , I modified my pure IO::Select server to use sysread, and your "eternal a" script dosn't hang it anymore. Here is the server, client, and your hanger-script.

I run the server, then start one conventional client, then your hanger-script, then a second client. All works well. Is this the mythical Holy Grail select script that you have been looking for? :-) It may not be perfected yet, but it works non-blocking here.

Server:

#!/usr/bin/perl use warnings; use strict; use IO::Socket; use IO::Select; my @sockets; my $machine_addr = 'localhost'; my $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"; my $readable_handles = new IO::Select(); $readable_handles->add($main_sock); while (1) { ###################################################################### #this line caused 100% cpu usage ( thanks to BrowserUk for pointing + this out) #my ($new_readable) = IO::Select->select($readable_handles, undef, +undef, 0 ); #should be my ($new_readable) = IO::Select->select($readable_handles, undef, u +ndef, undef ); #################################################################### foreach my $sock (@$new_readable) { if ($sock == $main_sock) { my $new_sock = $sock->accept(); $readable_handles->add($new_sock); } else { my $count = sysread $sock, my $buf, 1024; print "$count\n"; if ($buf) { print "$buf\n"; my @sockets = $readable_handles->can_write(1); print "@sockets\n"; #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();

The 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"; } }

And your hanger-test script

perl -MIO::Socket -E ' $s=IO::Socket::INET->new("localhost:1200"); $s- +>send( "a" ); sleep 1e6 '

I'm not really a human, but I play one on earth.
Old Perl Programmer Haiku ................... flash japh


Comment on Re: Does IO::Select work? Solution
Select or Download Code
Re^2: Does IO::Select work? Solution
by BrowserUk (Pope) on Oct 24, 2012 at 20:22 UTC
    Is this the mythical Holy Grail select script that you have been looking for?

    Not really. Start your server and before you connect anything, check top. 100% cpu when doing nothing isn't nice.


    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.

    RIP Neil Armstrong

    .
      So that 100% cpu usage, is where you think the kernel needs tweaking? It's an odd 100%, because it dosn't seem to slow down my other processes. Maybe the kernel processing reporting is deceiving, just like the problem with memory gains, where even though ps says memory is being held by a process, the memory gain is just in the swap area, or some technical detail, which isn't real memory.

      Is this 100% cpu usage really 100%? If so, how come all my other apps are still as responsive as ever?


      I'm not really a human, but I play one on earth.
      Old Perl Programmer Haiku ................... flash japh

        Just change the time-out, probably from 0 to "infinity" (which is likely represented by -1).

        - tye        

Re^2: Does IO::Select work? Solution
by Mr. Muskrat (Abbot) on Oct 25, 2012 at 17:58 UTC

    When I only care about readable handles, I prefer to use can_read rather than select.

    my @new_readable = $readable_handles->can_read(0);

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1000629]
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others making s'mores by the fire in the courtyard of the Monastery: (8)
As of 2014-08-28 03:36 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (255 votes), past polls