| Category: | Networking Code |
| Author/Contact Info | zentara of perlmonks. |
| Description: | About as simple a forking bi-directional client as you can get. Use with Glib based forking server with root messaging |
#!/usr/bin/perl
use warnings;
use strict;
use IO::Socket;
my ( $host, $port, $kidpid, $handle, $line );
( $host, $port ) = ('localhost',2345);
my $name = shift || 'anon';
#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;
}
print "kill term $kidpid\n";
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";
}
}
close $handle;
print "socket closed at server\n";
|
|
|
|---|
| Replies are listed 'Best First'. | |
|---|---|
|
Re: Simple bi-directional forking commandline client
by halfcountplus (Hermit) on Sep 06, 2008 at 05:09 UTC |