我有一个简单的脚本,该脚本应绑定到SMSC并侦听传入的消息。我遇到的问题是,如果它没有收到任何消息,它会超时。使用Net :: SMPP作为ESME接收器的套接字超时
下面是脚本:
#!/usr/bin/perl
use Net::SMPP;
use Data::Dumper;
$Net::SMPP::trace = 1;
$smpp = Net::SMPP->new_receiver('--removed--',
port => '--removed--',
system_id => '--removed--',
password => '--removed--',
) or die;
while (1)
{
$pdu = $smpp->read_pdu() or die;
print "Received #$pdu->{seq} $pdu->{cmd}:". Net::SMPP::pdu_tab->{$pdu->{cmd}}{cmd} ."\n";
print "From: $pdu->{source_addr}\nTo: $pdu->{destination_addr}\nData: $pdu->{data}\n";
print "Messsage: $pdu->{short_message}\n\n";
}
这里是我得到的错误:
premature eof reading from socket at /usr/lib/perl5/site_perl/5.8.8/Net/SMPP.pm line 2424.
$VAR1 = undef;
下面是从SMPP.pm相关子:
sub read_hard {
my ($me, $len, $dr, $offset) = @_;
while (length($$dr) < $len+$offset) {
my $n = length($$dr) - $offset;
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm ${*$me}{enquire_interval} if ${*$me}{enquire_interval};
warn "read $n/$len enqint(${*$me}{enquire_interval})" if $trace>1;
while (1) {
$n = $me->sysread($$dr, $len-$n, $n+$offset);
next if $! =~ /^Interrupted/;
last;
}
alarm 0;
};
if ([email protected]) {
warn "ENQUIRE [email protected]" if $trace;
die unless [email protected] eq "alarm\n"; # propagate unexpected errors
$me->enquire_link(); # Send a periodic ping
} else {
if (!defined($n)) {
warn "error reading header from socket: $!";
${*$me}{smpperror} = "read_hard I/O error: $!";
${*$me}{smpperrorcode} = 1;
return undef;
}
#if ($n == 0) { last; }
if (!$n) {
warn "premature eof reading from socket";
${*$me}{smpperror} = "read_hard premature eof";
${*$me}{smpperrorcode} = 2;
return undef;
#return 0;
}
}
}
#warn "read complete";
return 1;
}
在sub,它所触及的if语句是$ n为0或undef的语句。
我的猜测是套接字超时并断开连接。我怎样才能让听众无限期地保持下去?
另外,这个监听器在等待pdu时阻塞。有没有阻止听的方法?
我是一名电信工程师,他负责编程,我已经浏览了所有可找到的资料,但找不到答案。
我试过了一个异步实现,但当没有数据通过线路时它仍然超时。 – Alo
我所做的是捕捉错误并重新连接。即使我仍然看到eof错误,它仍然有效。有没有更优雅的做法? – Alo