use strict; use warnings; $|++; use IO::Socket::INET; use IO::Select; use threads; use constant EXTERNADDR => '127.0.0.1'; use constant EXTERNPORT => 2005; use constant INTERNADDR => '127.0.0.1'; use constant INTERNPORT => 4711; sub thread_proc { my $externsocket = IO::Socket::INET->new( PeerAddr => EXTERNADDR, PeerPort => EXTERNPORT, Type => SOCK_STREAM, Proto => "tcp" ) or die "Could not connect to external server : $@\n"; $externsocket->autoflush(1); my $internsocket = IO::Socket::INET->new( PeerAddr => INTERNADDR, PeerPort => INTERNPORT, Type => SOCK_STREAM, Proto => "tcp" ) or die "Could not connect to internal server : $@\n"; $internsocket->autoflush(1); my $select = IO::Select->new; $select->add($externsocket); $select->add($internsocket); print "Wait for readable socket\n"; while(my @handles = $select->can_read) { foreach my $handle (@handles) { my $line = $handle->getline; if(defined $line) { $line =~ s!\r?\n$!!g; if($handle == $internsocket) { # dad talks to us $externsocket->print("$line\n"); # send everything to the external server } elsif($handle == $externsocket) { # response from the server print "Server Reply: [$line]\n"; } } else { # socket closed from $select->remove($handle); $handle->close; } } } return (1); } my $internserver = IO::Socket::INET->new( LocalAddr => INTERNADDR, LocalPort => INTERNPORT, type => SOCK_STREAM, Reuse => 1, Listen => 10 ) or die "Could not create TCP server socket : $@\n"; $internserver->autoflush(1); my $t = threads->create(\&thread_proc); if(my $socket = $internserver->accept) { # wait for the thread print "Thread connected\n"; for my $i (0 .. 9) { $socket->print("Message #$i\n"); sleep(1); } $socket->print("quit\n"); $socket->close; $internserver->close; } $t->join; # wait for thread to finish