我有一個簡單的腳本,該腳本應綁定到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