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

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

by MonkE (Hermit)
on May 10, 2006 at 13:33 UTC ( #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!


Comment on Re: How to do simultaneous reads and writes to/from a socket?
Select or Download Code

Log In?
Username:
Password:

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

How do I use this? | Other CB clients
Other Users?
Others examining the Monastery: (13)
As of 2015-07-07 12:01 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The top three priorities of my open tasks are (in descending order of likelihood to be worked on) ...









    Results (88 votes), past polls