use strict; use warnings; use POE; use POE::Wheel::UDP; use POE::Filter::Stream; my $SERVER_ADDR = '127.0.0.1'; my $LOCAL_ADDR = '127.0.0.1'; my %PORTS = ( 8020 => 53036, 8019 => 53037, 8008 => 53038, 8003 => 53039); POE::Session->create( inline_states => { _start => sub { my ($kernel, $heap) = @_[KERNEL, HEAP]; while(my ($sport, $lport) = each %PORTS) { $heap->{"port$sport"} = POE::Wheel::UDP->new( LocalAddr => $LOCAL_ADDR, LocalPort => $lport, PeerAddr => $SERVER_ADDR, PeerPort => $sport, InputEvent => 'input', Filter => POE::Filter::Stream->new, ); $kernel->yield(heartbeat => $sport); } }, input => sub { my ($input) = $_[ARG0]; foreach my $msg (@{$input->{payload}}) { print "Message from $input->{addr}:$input->{port}: '$msg'\n"; } }, heartbeat => sub { my ($kernel, $heap, $sport) = @_[KERNEL, HEAP, ARG0]; $kernel->delay_add(heartbeat => 10, $sport); $heap->{"port$sport"}->put( { payload => [ "\x01" ] }); print "sent HB to $sport\n"; }, } ); POE::Kernel->run;