gpt4 book ai didi

Perl Net::SSLeay 检查套接字是否可读

转载 作者:太空宇宙 更新时间:2023-11-03 13:53:13 25 4
gpt4 key购买 nike

我正在使用一个名为 Net::APNS::Persistent 的 perl 模块。它帮助我打开与苹果的 apns server 的持久连接。并通过 APNS 发送推送通知。该模块使用 Net::SSLeay 与 APNS 服务器进行 ssl 通信。

现在,我想定期从我的套接字读取以检查 APNS 是否发回任何响应。 Net::APNS::Persistent 已经有一个名为 _read() 的函数,如下所示:

sub _read {
my $self = shift;

my ($socket, $ctx, $ssl) = @{$self->_connection};

my $data = Net::SSLeay::ssl_read_all( $ssl );
die_if_ssl_error("error reading from ssl connection: $!");

return $data;
}

但是,此功能仅在 APNS 断开连接并且我在尝试写入时出错时才有效。在其他时候,我的脚本卡在了,

my $data = Net::SSLeay::ssl_read_all( $ssl );

我检查了 Net::SSLeay 文档,发现它有一个名为 peek 的方法

Copies $max bytes from the specified $ssl into the returned value. In contrast to the Net::SSLeay::read() function, the data in the SSL buffer is unmodified after the SSL_peek() operation.

虽然它可能有用,但我在 Net::APNS::Persistent 模块中添加了另一个函数:

sub ssl_peek {
my $self = shift;
my ($socket, $ctx, $ssl) = @{$self->_connection};
print "Peeking \n";
my $data = Net::SSLeay::peek( $ssl, $pending );
print "Done peeking \n";
return $data;
}

不幸的是,这也给了我同样的问题。它只打印 Peeking 而永远不会到达打印 Done peeking 的行。使用 Net::SSLeay::read 时遇到同样的问题。有没有办法检查套接字是否可以读取或设置读取超时,以便我的脚本在尝试从套接字读取时不会卡住?

最佳答案

APNS documentation说如下:

If you send a notification that is accepted by APNs, nothing is returned.

If you send a notification that is malformed or otherwise unintelligible, APNs returns an error-response packet and closes the connection. Any notifications that you sent after the malformed notification using the same connection are discarded, and must be resent

只要您的通知被接受,就不会有任何数据要读取,因此套接字上的读取操作将被阻止。唯一可用的数据是出现错误时,然后连接立即关闭。这应该可以解释您观察到的行为。

关于Perl Net::SSLeay 检查套接字是否可读,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33002205/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com