Callback to delay a Server::TCP component?

[email protected] (Mike Schilli) Sun, 18 Apr 2010 17:50:36 -0700 (PDT)
Newsgroups perl.poe
Message-ID <alpine.LRH.1.00.1004181735170.19219@pyramidlake.greatamerica.corp.yahoo.com>
Hi POE folks,

while writing a port forwarder similar to the one in the POE cookbook,
just by using POE::Component::Server::TCP and ::Client::TCP instead, I hit
a roadblock when it came to synchronizing the components.

After POE::Component::Server::TCP has started up (binding to the 'From'
port), if a client connects to it, the server will call the
client_connect callback, which I'm using to spawn an instance of
POE::Component::Client::TCP to connect to the 'To' port.

At this time, I need the server to wait accepting requests from the
connecting client *until* POE::Component::Client::TCP has connected to the
'To' port.

However, there's no way to say in the client_connect callback that the
server should not proceed to the 'client_request' stage yet.

I found a workaround by setting a global variable $CONNECTED in

   my $client_session =
     POE::Component::Client::TCP->new(
         # ...
         Connected => sub { $CONNECTED = 1; },
         # ...

and adding

   $kernel->run_one_timeslice() while !$CONNECTED;

to the client_request callback of the POE::Component::Server::TCP
server. This does the trick, but I don't like that it's a
global variable that allows only single use of this component.

Is there a better way?

-- Mike

Mike Schilli
[email protected]