ryan@ryan-laptop:~/Documents/sockets$ perl bidir.pl 192.168.0.61 60128 [Connected to 192.168.0.61:60128] inc data! packet is >ISCP < data length is 12< inc data! packet is >!1MVL2D▒ < data length is 14< ^C ryan@ryan-laptop:~/Documents/sockets$ hd dump.bidir 00000000 49 53 43 50 00 00 00 10 00 00 00 0a 01 00 00 00 |ISCP............| 00000010 21 31 4d 56 4c 32 44 1a 0d 0a |!1MVL2D...| 0000001a #### #!/usr/bin/perl -w # biclient - bidirectional forking client use strict; use IO::Socket; use Data::Dumper qw(Dumper); #open OUT, ">dump.bidir"; 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 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 $line; print "inc data!\npacket is >$line<\n"; print "data length is " . length($line) . "<\n"; open OUT, ">>dump.bidir"; print OUT $line; close OUT; } kill("TERM" => $kidpid); # send SIGTERM to child } else { # child copies standard input to the socket while (defined ($line = )) { print $handle $line; } } exit;