在Perl线程中共享一个活动的IO :: Socket :: SSL套接字

时间:2012-12-12 22:14:45

标签: multithreading perl sockets ssl

我希望在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::SSLIO::Socket::SSL::SSL_Context对象。

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

0 个答案:

没有答案