ljamison has asked for the wisdom of the Perl Monks concerning the following question:
Hello Monks, I'm back again requesting assistance. I've been trying to tweak this POE Cookbook example but when I try to increment a variable within a subroutine is does not increment.
#!/usr/bin/perl use strict; use warnings; use POE qw(Component::Server::TCP Component::Client::TCP); # Spawn the forwarder server on port 8020. When new connections # arrive, spawn clients to connect them to their destination. my $sequence_number = '00001'; my $format_sequence_number = sprintf("%s", $sequence_number); POE::Component::Server::TCP->new( Port => 8000, ClientConnected => sub { my ($heap, $session) = @_[HEAP, SESSION]; logevent('server got connection', $session); spawn_client_side(); }, ClientInput => sub { my ($kernel, $session, $heap, $input) = @_[KERNEL, SESSION, HEAP, ARG0]; logevent('server got input', $session, $input); $kernel->post($heap->{client_id} => send_stuff => $input); }, ClientDisconnected => sub { my ($kernel, $session, $heap) = @_[KERNEL, SESSION, HEAP]; logevent('server got disconnect', $session); $kernel->post($heap->{client_id} => "shutdown"); }, InlineStates => { send_stuff => sub { my ($heap, $stuff) = @_[HEAP, ARG0]; logevent("sending to server", $_[SESSION]); $heap->{client}->put($stuff); }, _child => sub { my ($heap, $child_op, $child) = @_[HEAP, ARG0, ARG1]; if ($child_op eq "create") { $heap->{client_id} = $child->ID; } }, }, ); sub spawn_client_side { POE::Component::Client::TCP->new( RemoteAddress => 'localhost', RemotePort => 8001, Started => sub { $_[HEAP]->{server_id} = $_[SENDER]->ID; }, Connected => sub { my ($heap, $session) = @_[HEAP, SESSION]; logevent('client connected', $session); }, ServerInput => sub { my ($kernel, $heap, $session, $input) = @_[KERNEL, HEAP, SESSION, ARG0]; logevent('client got input', $session, $input); $kernel->post($heap->{server_id} = send_stuff => $input); }, Disconnected => sub { my ($kernel, $heap, $session) = @_[KERNEL, HEAP, SESSION]; logevent('client disconnected', $session); $kernel->post($heap->{server_id} => 'shutdown'); }, InlineStates => { send_stuff => sub { my ($heap, $stuff) = @_[HEAP, ARG0]; logevent('sending to client', $_[SESSION]); if ($stuff =~ /READ/) { $stuff = $format_sequence_number . 'READ' . '00000'; $heap->{server}->put($stuff); $sequence_number += 1; } }, }, ); } sub logevent { my ($state, $session, $arg) = @_; my $id = $session->ID(); print "session $id $state "; print ": $arg" if (defined $arg); print "\n"; } warn 'running'; $poe_kernel->run(); exit 0;
I have 2 main goals with this code:
|
|---|