AnyEvent-PacketForwarder

 view release on metacpan or  search on metacpan

examples/pktproxy.pl  view on Meta::CPAN


    $self;
}

sub _on_connected_to_server {
    my ($self, $server_socket) = @_;
    if (defined $server_socket) {
        $self->{server_socket} = $server_socket;
        my $client_socket = $self->{client_socket};

        use Data::Dumper;
        print STDERR Data::Dumper->Dump([$self], [qw($self)]);

        $self->{c2s_forwarder} = packet_forwarder $client_socket, $server_socket, $header_templ,
            weak_method_callback($self, '_on_data', 'c2s');
        $self->{s2c_forwarder} = packet_forwarder $server_socket, $client_socket, $header_templ,
            weak_method_callback($self, '_on_data', 's2c');
    }
    else {
        warn "unable to connect to remote server: $!\n";
        delete $pp_by_client_fd{$self->{client_fd}};
    }

lib/AnyEvent/PacketForwarder.pm  view on Meta::CPAN

    # data is:   0:reader, 1:out, 2:queue_size, 3:queue, 4:cb, 5:out_watcher
    my $data = [ undef   , $out , $queue_size , []     , $cb , undef         ];
    $data->[0] = packet_reader $in, $templ, $max_load_length, sub { _packet($_[0], $data) };

    my $obj = \$data;
    bless $obj;
}

sub _push {
    my $data = $_[1];
    # use Data::Dumper;
    # print STDERR Data::Dumper->Dump([\@_, $data], [qw(@_ $data)]);
    if (length $_[0]) {
        my $queue = $data->[3];
        push @$queue, $_[0];
        $data->[0]->pause if @$queue == $data->[2];
        $data->[5] ||= AE::io $data->[1], 1, sub { _write($data) };
    }
}

sub _packet {
    my $data = $_[1];
    if (defined $_[0]) {
        # use Data::Dumper;
        # print STDERR Data::Dumper->Dump([$data], [qw($data)]);
        $data->[4]->($_[0]);
        _push(@_);
        return;
    }
    $data->[4]->();
    _fatal_write($data, ENODATA) unless defined $data->[5];
    undef $data->[0];
}

sub _write {



( run in 0.246 second using v1.01-cache-2.11-cpan-4d50c553e7e )