http://qs1969.pair.com?node_id=589233

JEDU has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I have and issue when I use Net::smpp in case of enquire_link_resp, I get the bind with no problem and I send messages... ok, but when SMSc request enquire_link_resp sometho\ing happen the loop is :
while (1) { warn "Waiting for PDU"; $pdu = $smpp->read_pdu() or die "$$: PDU not read. Closing connect +ion"; print "Received #$pdu->{seq} $pdu->{cmd}:". Net::SMPP::pdu_tab->{$ +pdu->{cmd}}{cmd} ."\n" ; warn Dumper($pdu) if $trace; if (defined reply_tab->{$pdu->{cmd}}) { &{reply_tab->{$pdu->{cmd}}{reply}}($c, $pdu); warn "Replied"; } else { warn "Don't know to reply to $pdu->{cmd}"; sleep 1; } }

That mach with

0x00000015 => { cmd => 'enquire_link', reply => sub { my ($me, $pdu) = @_; $me->enquire_link_resp(seq => $pdu->{seq}) }, },

But when an enquire_link is recived I get this:

Received #2 21:enquire_link $VAR1 = bless( { 'known_pdu' => 1, 'cmd' => 21, 'status' => 0, 'data' => '', 'reserved' => undef, 'seq' => 2 }, 'Net::SMPP::PDU' ); Can't call method "enquire_link_resp" on an undefined value at .....es +me-re.pl line 89.

20061213 Janitored by Corion: Added formatting, code tags, as per Writeup Formatting Tips

Replies are listed 'Best First'.
Re: Net::smpp enquire_link_resp
by themage (Friar) on Dec 12, 2006 at 09:50 UTC
    Hi JEDU,

    I presume this is your line 89 (it's the first call to reply_tab->{$pdu->{cmd}}):
    if (defined reply_tab->{$pdu->{cmd}}) {
    So, my questions are:
    • What is reply_tab (a sub that return an object or a missing $ )?
    • is reply_tab return what is should?


    TheMage
    Talking Web
      Hi, no the line 89 is: 0x00000015 => { cmd => 'enquire_link', The reply_tab is a sub that process the PDU in case of match send a re +ply to PDU use constant reply_tab => { 0x80000000 => { cmd => 'generic_nack', reply => undef, }, 0x00000001 => { cmd => 'bind_receiver', reply => sub { my ($me,$pdu) = @_; $me->set_version(0x34); $me->bind_receiver_resp(system_id => $sysid, seq => $pdu->{seq}); . . . . 0x00000015 => { cmd => 'enquire_link', reply => sub { my ($me, $pdu) = @_; $me->enquire_link_resp(seq => $pdu->{seq}) }, }, . . .} Reply_tab do not return the correct answer...
        Hi JEDU,

        If the line 89 is the code you past now, then the undefined value you're calling enquire_link_resp is $me in your 0x0...015 reply sub.

        I presume that the call to that sub is not being done with the correct values. It looks like you have a complex code, so you may need to debug it carefully to find in which step you lose the $me value.

        TheMage
        Talking Web