我希望在Perl线程(5.10.1& up)之间共享/传递IO::Socket::SSL
对象。
我接受一个线程中的SSL连接 - 它已经打开并且正在谈论SSL - 然后将其交给其他已经运行的工作线程。 IO::Socket::SSL
对象不可共享,因为它基于符号/ glob; shared_clone()
等失败。
我想抓住SSL上下文和fileno,它们是可共享的,然后使用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
...
上面给我的上下文,看起来只是一个标量数字。在工作线程中,我使用此上下文和fileno,然后执行:
my $reborn = IO::Socket::SSL->new_from_fd ($fd,
PeerAddr => $ADDR,
Blocking => 0,
...other non-SSL options...
SSL_reuse_ctx => $ctx,
);
我还尝试了IO::Socket::SSL->new()
以及fdopen()
和open()
的变体。它们在SSL.pm
模块(第1343行,isa
调用)中爆炸,表明上下文值应为IO::Socket::SSL
或IO::Socket::SSL::SSL_Context
对象。
我还没有找到有效的咒语。如何将有效的上下文对象传递给IO::Socket::SSL->new_from_fd()
,以便我可以在新线程中重新实例化原始套接字?而且,这甚至会起作用吗?想法?