我正在使用一个使用Net :: SSLeay的库(Net :: APNS :: Persistent)。该库有助于与Apples APNS服务器通信。我发现如果我发送任何错误的数据,例如错误的令牌或格式不良的有效载荷,程序会在三次尝试后终止。并且它没有显示错误消息。
根据我的调试,此问题发生在SSLeay.pm的第1895行
$ write = write_partial($ ssl,$ written,$ to_write,$$ data_ref);
我试图捕捉是否有任何异常,期限信号被发送但没有运气。如果存在网络问题或任何类型的错误,我希望它应该显示可以处理的错误消息/异常。但它只是在没有说什么的情况下杀死程序。有没有办法解决这个问题?我的代码如下:
package apnsClient;
use Net::APNS::Persistent;
use Data::Dumper;
use Test::Trap;
my $cfg;
my $apns;
sub load {
my $class = shift;
my $self = {
_cfg => shift,
};
$cfg = $self->{_cfg};
bless $self, $class;
return $self;
}
sub connect {
my ($sandbox, $cert, $key, $pass) = $cfg->getAPNSServer();
print "[x] Cert $cert Key $key \n";
$apns = Net::APNS::Persistent->new({
sandbox => $sandbox,
cert => $cert,
key => $key,
}) or die("[-] Unable to connect to APNS server");
}
sub push {
my ($class,$token,$payload) = @_;
print "[+] Sending push with token: $token and Data: \n ".Dumper($payload);
$apns->queue_notification(
$token,
$payload
);
print "[+] Sending apns queue \n";
$apns->send_queue;
print "[+] Sent \n";
}
sub disconnect {
$apns->disconnect;
}
1;
答案 0 :(得分:0)
最终弄清楚问题。如果提供了无效令牌,则Apple服务器会丢弃会话,而当写入套接字失败时,write_partial函数会发送终止信号。为防止脚本终止,我们需要使用
$SIG{'PIPE'} = 'IGNORE';