Writing Bidirectional Clients
Problem
You want set up a fully interactive client so you can type a line, get the answer, type a line, get the answer, etc., somewhat like telnet.
Solution
Once you’ve connected, fork off a duplicate process. One twin only reads your input and passes it on to the server, and the other only reads the server’s output and sends it to your own output.
Discussion
In a client-server relationship, it is difficult to know whose turn
it is to talk. Single-threaded solutions involving the four-argument
version of select
are hard to write and maintain.
But there’s no reason to ignore multitasking solutions. The
fork
function dramatically simplifies this
problem.
Once you’ve connected to the service you’d like to chat
with, call fork
to clone a twin. Each of these two
(nearly) identical processes has a simple job. The parent copies
everything from the socket to standard output, and the child
simultaneously copies everything from standard input to the socket.
The code is in Example 17.4.
Example 17-4. biclient
#!/usr/bin/perl -w # biclient - bidirectional forking client use strict; use IO::Socket; my ($host, $port, $kidpid, $handle, $line); unless (@ARGV == 2) { die "usage: $0 host port" } ($host, $port) = @ARGV; # 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 ...
Get Perl Cookbook now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.