Beefy Boxes and Bandwidth Generously Provided by pair Networks
The stupid question is the question not asked
 
PerlMonks  

Re: Sockets and Fork, Please Help Me!!

by mortis (Pilgrim)
on Dec 12, 2001 at 22:28 UTC ( [id://131328]=note: print w/replies, xml ) Need Help??


in reply to Sockets and Fork, Please Help Me!!

Try taking a look at IO::Select, and modifying your design to do non-blocking io with the various file handles. Something like:
use strict; use warnings; use IO::Handle; use IO::Select; my $s = IO::Select->new(); ... $s->add(0); # STDIN $s->add($telnet->fileno()); $s->add($telnet2->fileno()); while(1) { my @ready = $s->can_read(); last unless @ready; foreach my $fd (@ready) { &handleTelnet1() if $telnet->fileno() == $fd; &handleTelnet2() if $telnet2->fileno() == $fd; &handleStdin() if 0 == $fd; } } ...
The above code does assume that your $telnet handles are IO::Handle objects.

Updated: robin pointed out some bugs in the example code relating to stdin. Thanks.

Replies are listed 'Best First'.
Re: Re: Sockets and Fork, Please Help Me!!
by robin (Chaplain) on Dec 12, 2001 at 22:58 UTC
    IO::Select is definitely the right thing to use here, but I think your code can be simplified a little. Firstly, there's no need to use $s->add($telnet->fileno()), because add can take a filehandle as its argument. So $s->add($telnet); will suffice. You have a bug related to that: the can_read method will return the same objects that you added to the IO::Select object, and so in your code when standard input is ready for reading it will return the glob reference for STDIN, rather than the file number. That will never test equal to zero. (Its numeric value will actually be the memory address of the glob.)

    Secondly, if you know all your handles in advance you can just pass them to the IO::Select constructor rather than adding them one by one. And the can_read call can be incorporated directly into the loop condition. So maybe something like:

    use strict; use IO::Select; my $s = IO::Select->new(\*STDIN, $telnet, $telnet2); while (my @ready = $s->can_read()) { for my $ready (@ready) { if ($ready == \*STDIN) { handle_stdin(); } else { handle_telnet($ready); } } }

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others admiring the Monastery: (4)
As of 2024-04-25 06:16 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found