Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 检查套接字是否可以读取_Perl_Ssl_Apple Push Notifications - Fatal编程技术网

Perl 检查套接字是否可以读取

Perl 检查套接字是否可以读取,perl,ssl,apple-push-notifications,Perl,Ssl,Apple Push Notifications,我正在使用一个名为Net::APNS::perl的模块。它帮助我打开与苹果的持久连接,并通过APN发送推送通知。此模块使用Net::SSLeay与APNS服务器进行ssl通信 现在,我想定期从我的套接字读取数据,以检查APNS是否返回任何响应。Net::APNS::Persistent已经有一个名为_read()的函数,如下所示: sub _read { my $self = shift; my ($socket, $ctx, $ssl) = @{$self->_conn

我正在使用一个名为Net::APNS::perl的模块。它帮助我打开与苹果的持久连接,并通过APN发送推送通知。此模块使用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 doc,发现它有一个名为peek的方法

将指定的$ssl中的$max字节复制到返回值中。与Net::SSLeay::read()函数不同,SSL缓冲区中的数据在SSL_peek()操作后不会被修改

我认为它可能有用,所以我在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;
}

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

要检查基础套接字是否可以读取,请使用select,即

 IO::Select->new(fileno($socket))->can_read(timeout);
超时可以是
0
以仅检查而不等待,可以是秒数,也可以是
undef
以永远等待。但在执行select之前,请检查SSL缓冲区中的数据是否仍然可用:

 if (Net::SSLeay::pending($ssl)) { ... use SSL_peek or SSL_read ... }
除此之外,您使用的模块似乎甚至没有尝试验证服务器证书:(

说明如下:

如果您发送的通知已被APNs接受,则不会返回任何内容

如果您发送的通知格式错误或无法理解,APNs将返回错误响应数据包并关闭连接。在使用相同连接发送错误通知后发送的任何通知都将被丢弃,并且必须重新发送


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

通过查看int,您实际上想要实现什么o套接字?您是否希望以下划线(\ux)为前缀的APNS?函数做出响应不应该是模块接口的一部分,因此您不应该在理想情况下使用它们。是的,我正在尝试查看APNS是否正在发送任何响应。请忽略下划线。我正在从另一个函数内部调用此函数。感谢我们的答复。我实际上也尝试了Net::SSLeay::pending。它始终为我提供0。Ev当我可以从套接字读取某些内容时(一旦连接断开).知道为什么吗?@user3360140:只有当本地SSL缓冲区中有未读数据时,才会进行挂起的检查。它不会尝试从网络中读取数据。因此,在连接关闭之前读取套接字是没有意义的。非常感谢…这回答了我的问题。你能不能也看看我的其他线程。希望你能为他们提供一些答案还有。谢谢你的帮助!我很高兴能帮上忙。我看了你的另一个问题,但不幸的是,我对APNs的了解不够,无法回答这个问题。