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