Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl-Sensitive Sunglasses
 
PerlMonks  

Re: How to do simultaneous reads and writes to/from a socket?

by MonkE (Hermit)
on May 10, 2006 at 13:33 UTC ( [id://548455]=note: print w/replies, xml ) Need Help??


in reply to How to do simultaneous reads and writes to/from a socket?

You need to understand that one socket is needed to listen for connections, and another different socket is needed for each active client. So ultimately you will need to keep a list of what clients are connected. I modifed your example code to spawn one thread per client. It now has a separate listener thread also. What the code below still lacks is: tracking of client connections (a must-have for a chat program); sending output to all active clients; and many other niceities such as proper naming of clients, etc. Hopefully this will get you started though.
use strict; use threads; use threads::shared; use IO::Socket; my $keep_running : shared = 1; my $sender_thread = threads->new(\&do_send); my $listener_thread = threads->new(\&do_listen); $sender_thread->detach(); $listener_thread->join(); sub do_listen { my $listener_sock = IO::Socket::INET->new(LocalHost => "127.0. +0.1", LocalPort => 8080, Type => SOCK_STREAM, Proto => 'tcp', Listen => 1); my $client_sock; my $ClientNumber = 0; STDOUT->autoflush(1); print "Starting listener\n"; while ($keep_running) { my $client_sock = $listener_sock->accept(); my $reader_thread = threads->new(\&do_read, $client_so +ck, $ClientNumber); last unless defined($client_sock); $ClientNumber++; $reader_thread->detach(); print "Accepted a connection\n"; } print "Listener stopped\n"; } sub do_read { my $sock = shift; my $ClientNumber = shift; while (<$sock>) { print $ClientNumber . ":" . $_; } print "Client " . $ClientNumber . " disconnected\n"; } sub do_send { # any messages that the local user types while (my $line = <STDIN>) { # TODO: you need to iterate through all active clients and sen +d them # , not just one # $sock->print($line); # $sock->flush(); # patch for development sleep 1; } $keep_running = 0; }
I tested it myself with two clients and got this output:
Starting listener Accepted a connection 0:hi Accepted a connection 1:hi 0:Yo #1 1:Whaddup #0!

Log In?
Username:
Password:

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

How do I use this?Last hourOther CB clients
Other Users?
Others having a coffee break in the Monastery: (3)
As of 2024-04-26 02:32 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    No recent polls found