Oh man, ich bin hier wohl möglich auf einen Bug gestossen oder so, denn
die Serialisierung mit nfreeze() klappt wunderbar, allerdings lassen sich
die Daten nicht via
IO::Socket::SSL übertragen. Das gleiche Konstrukt
funktioniert mit IO::Socket::INET im Gegensatz problemlos.
Im Skript mywrite.pl schreibe ich die Daten zusätzlich in eine Pipe, die von
myread.pl aus der Pipe gelesen werden. Das funktioniert ohne Probleme.
Muss ich mit IO::Socket::SSL irgendeine Option setzen? Ich habe keine
gefunden, die das Problem beseitigen könnte.
mywrite.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
use strict;
use warnings;
use Data::Dumper;
use Storable qw(nfreeze);
use IO::Socket::SSL;
while (1) {
my $socket = IO::Socket::SSL->new(
Listen => 5,
LocalAddr => 'localhost',
LocalPort => 9000,
Proto => 'tcp',
Reuse => 1,
SSL_verify_mode => 0x01,
SSL_passwd_cb => sub {return "bluebell"},
) or die "unable to open socket over localhost:9000";
while (my $client = $socket->accept()) {
chomp (my $request = <$client>);
next unless $request;
print "Request: $request\n";
my $stats = {
'memstats' => {
'Cached' => '164352',
'MemTotal' => '1035972',
'SwapUsed' => '0',
'Buffers' => '79600',
'SwapUsedPer' => '0.00',
'MemUsed' => '377636',
'SwapTotal' => '2096472',
'MemUsedPer' => '36.45',
'SwapFree' => '2096472',
'MemFree' => '658336'
}
};
my $p2s = nfreeze($stats) or die $!;
print $client $p2s;
close($client);
close($socket);
system("mknod ./myfifo p") unless -e './myfifo';
open my $fh, '>>', './myfifo', or die $!;
print $fh $p2s;
close $fh;
}
}
myread.pl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
use strict;
use warnings;
use Data::Dumper;
use Storable qw(thaw);
use IO::Socket::SSL;
use Safe;
my $safe = new Safe;
$safe->permit(qw(:default require));
{
no warnings 'once';
$Storable::Deparse = 1;
$Storable::Eval = sub { $safe->reval($_[0]) };
}
while (1) {
my $socket = IO::Socket::SSL->new(
PeerAddr => 'localhost',
PeerPort => '9000',
Proto => 'tcp',
SSL_use_cert => 1,
SSL_verify_mode => 0x01,
SSL_passwd_cb => sub { return "opossum" }
) or die "unable to connect to 127.0.0.1:9000";
print $socket "__STATISTICS___\n";
local $/;
my $p2s = <$socket>;
my $s2p = thaw($p2s);
print "-----------FROM IO::SOCKET-----------\n";
print Dumper($s2p);
close($socket);
{
print "\n-----------FROM LOCAL PIPE-----------\n";
open my $fh, '<', './myfifo', or die $!;
local $/;
my $p2s = <$fh>;
my $s2p = thaw $p2s;
print Dumper($s2p);
}
sleep 3;
}
Die Zertifikate stammen aus dem example-Directory von IO::Socket::SSL.
Ausgabe:
#> ./myread.pl
-----------FROM IO::SOCKET-----------
$VAR1 = undef;
-----------FROM LOCAL PIPE-----------
$VAR1 = {
'memstats' => {
'Cached' => '164352',
'MemTotal' => '1035972',
'SwapUsed' => '0',
'SwapUsedPer' => '0.00',
'Buffers' => '79600',
'MemUsed' => '377636',
'SwapTotal' => '2096472',
'SwapFree' => '2096472',
'MemUsedPer' => '36.45',
'MemFree' => '658336'
}
};
Kennt sich hier jemand besonders gut aus und weiß, was ich machen kann?
Einen Bug-Report bei CPAN habe ich auch schon aufgemacht, aber auf
eine Lösung kann ich wahrscheinlich Monate warten, was mich dazu zwingt,
etwas anderes als
Storable zu benutzen, aber das
möchte ich garnicht.\n\n
<!--EDIT|opi|1163867311-->
What is a good module? That's hard to say.
What is good code? That's also hard to say.
One man's Thing of Beauty is another's man's Evil Hack.