IO::Socket::SSL
Perlスレッド(5.10.1以降)間でオブジェクトを共有/受け渡したい。
私は1つのスレッドでSSL接続を受け入れます-それはすでに開いていてSSLを話します-そしてそれを他のすでに実行されているワーカースレッドに渡します。IO::Socket::SSL
オブジェクトはシンボル/グロブに基づいているため、共有できません。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()
のバリエーションも試してみました。それらは、コンテキスト値がorオブジェクトであることを示す方法で、モジュール内で爆発します(行1343、呼び出し)。fdopen()
open()
SSL.pm
isa
IO::Socket::SSL
IO::Socket::SSL::SSL_Context
うまくいく呪文は見つかりませんでした。IO::Socket::SSL->new_from_fd()
新しいスレッドで元のソケットを再インスタンス化できるように、渡す有効なコンテキストオブジェクトを取得するにはどうすればよいですか?そして、これもうまくいくでしょうか?アイデア?