1

我希望IO::Socket::SSL跨 Perl 线程(5.10.1 及更高版本)共享/传递一个对象。

我在一个线程中接受 SSL 连接——它已经打开并且正在使用 SSL——然后将它交给其他已经在运行的工作线程。该IO::Socket::SSL对象不可共享,因为它基于符号/全局;shared_clone()等失败。

我想获取可共享的 SSL 上下文和文件号,然后用于new_from_fd()在工作线程中重新创建套接字。例如,监听器会做(这里为了简单起见省略了错误检查等):

...
my $sock = $listener->accept();             # Grab the next SSL connection
$sock->peek(...);                           # Peek to see what to do with it...
my $ssl  = $sock->_get_ssl_object();        # Get internal SSL handle
my $ctx  = Net::SSLeay::get_SSL_CTX($ssl);  # Get context
...

以上为我提供了上下文,它看起来只是一个标量。在工作线程中,我使用此上下文和文件号,然后执行以下操作:

my $reborn = IO::Socket::SSL->new_from_fd ($fd,
    PeerAddr      => $ADDR,
    Blocking      => 0,
    ...other non-SSL options...
    SSL_reuse_ctx => $ctx,
);

我也尝试过 justIO::Socket::SSL->new()和 and 的变fdopen()open()SSL.pm它们在模块(第 1343 行,isa调用)内以一种指示上下文值应该是一个IO::Socket::SSLIO::Socket::SSL::SSL_Context对象的方式爆炸。

我还没有找到有效的咒语。如何获取要传递的有效上下文对象,IO::Socket::SSL->new_from_fd()以便我可以在新线程中重新实例化原始套接字?而且,这甚至会奏效吗?想法?

4

0 回答 0