Here's what I have that works but does not do quite what
I want.
SERVER ONE
#!/usr/bin/perl -Tw
use strict;
use Socket;
use Carp;
my $EOL = "\015\012";
sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
my $port = shift || 2111;
my $proto = getprotobyname('tcp');
$port = $1 if $port =~ /(\d+)/; # untaint port number
socket(Server, PF_INET, SOCK_STREAM, $proto)
|| die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))
|| die "setsockopt: $!";
bind(Server, sockaddr_in($port, INADDR_ANY))
|| die "bind: $!";
listen(Server,SOMAXCONN)|| die "listen: $!";
logmsg "server started on port $port";
my $paddr;
$SIG{CHLD} = \&REAPER;
for(;$paddr = accept(Client,Server); close Client) {
my($port,$iaddr) = sockaddr_in($paddr);
my $name = gethostbyaddr($iaddr,AF_INET) || 'Unknown';
my $C = 'DUH';
logmsg "conn from $name [", inet_ntoa($iaddr), "] port $port";
print Client "Hi, [$C], it's now ", scalar localtime, $EOL;
}
This works fine with the below client ... Its bit slow but I ain't in a hurry
The Client
#!/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(); # 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());
if ($kidpid) {
# parent copies the socket to standard output
while (defined ($line = <$handle>)) { print STDOUT "$0:$line"; }
kill("TERM" => $kidpid); # send SIGTERM to child
} else {
# child copies standard input to the socket
while (<STDIN>) {
print "child write to handle line= [$_]\n";
print $handle $_ . "\015\012";
}
}
print "$kidpid exitting\n";
exit;
... now when I chane the server to be like so ...
SERVER TWO
#!/usr/bin/perl -Tw
use strict;
use Socket;
use Carp;
my $EOL = "\015\012";
sub logmsg { print "$0 $$: @_ at ", scalar localtime, "\n" }
my $port = shift || 2111;
my $proto = getprotobyname('tcp');
$port = $1 if $port =~ /(\d+)/; # untaint port number
socket(Server, PF_INET, SOCK_STREAM, $proto)
|| die "socket: $!";
setsockopt(Server, SOL_SOCKET, SO_REUSEADDR, pack("l", 1))
|| die "setsockopt: $!";
bind(Server, sockaddr_in($port, INADDR_ANY))
|| die "bind: $!";
listen(Server,SOMAXCONN)
|| die "listen: $!";
logmsg "server started on port $port";
my $paddr;
$SIG{CHLD} = \&REAPER;
while (1) {
for (;$paddr = accept(Client,Server); close Client) {
my($port,$iaddr) = sockaddr_in($paddr);
my $name = gethostbyaddr($iaddr,AF_INET) || 'Unknown';
my $C = join ('', <Client>);
logmsg "conn from $name [", inet_ntoa($iaddr), "] port $port";
print Client "Hi, [$C], it's now ", scalar localtime, $EOL;
}
}
... everything hangs. I suspect that server is
hanging on this line ...
my $C = join ('', <Client>);
Why is it hanging and how do I stop it from hanging?