Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]8249[/thread]

Hash Struktur senden: Client - Server (Seite 2)

Leser: 1


<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten
ptk
 2006-11-17 23:10
#69024 #69024
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Noch mehr Module findest du auf http://web.archive.org/web/20060507091304/http://idisk.mac.com/christian.hansen/Public/perl/serialize.pl (leider macht die Forumsoftware den Link kaputt...), zusammen mit Benchmarks. Convert::Bencode_XS sieht sehr interessant. Storable ist aber unschlagbar, was die unterstützten Perl-Daten angeht. Man hat keine Probleme mit utf8- vs. nicht-utf8-Strings, man kann sogar Subroutinen serialisieren, wenn man möchte.
topeg
 2006-11-18 01:40
#69025 #69025
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Mir war mal Data::Dumper zu langsam und ich habe mir was zusammengschrieben, das recht schnell ist, hat aber ein paar Einschränkungen. Nur Hashes, Arrays und Skalare werden serialisiert, nichts sonst, Zahlen werden zu Strings, Hashnamen und Strings dürfen kein ' enthalten, das könnte beim entpacken Probleme machen.
Der Output ist recht kompackt.
Es ist klein!
Code: (dl )
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
package Mydumper;
use strict;
use warnings;

sub dumper($)
{
our sub rc($)
{
my $ref=shift(@_);
my $ref_n=ref($ref);
my $data='';
my $l;
if($ref_n)
{
if($ref_n eq 'HASH')
{
$data='{';
while (@_=each(%$ref))
{
$l=&rc($_[1]);
$data.='\''.$_[0].'\''.$l if($l);
}
$data.='}';
}
elsif($ref_n eq 'ARRAY')
{
$data='[';
$data.=&rc($_) for(@$ref);
$data.=']';
}
}
else
{ $data='\''.$ref.'\''; }
return $data;
}
return rc(shift(@_));
}

sub undumper($)
{
our $data=shift(@_);
our sub rcu()
{
my $ref;
if(index($data,'\'')!=0)
{
$data=~s/^.*?(\[|\{)//s;
my $z=$1;
if($z eq '{')
{
$ref={};
while(index($data,'}')!=0)
{
$data=~s/^'(.+?)'//s;
my $n=$1;
$ref->{$n}=&rcu();
}
$data=~s/^}//;
}
elsif($z eq '[')
{
$ref=[];
push(@$ref,&rcu()) while(index($data,']')!=0);
$data=~s/^]//;
}
}
else
{ $data=~s/^'(.*?)'//s; $ref=$1; }
return $ref;
}
return &rcu();
}

1;


Edit: Einrückungen korrigiert....\n\n

<!--EDIT|topeg|1163807733-->
lichtkind
 2006-11-18 03:08
#69026 #69026
User since
2004-03-22
5681 Artikel
ModeratorIn + EditorIn
[Homepage]
user image
topeg: routinen haben in perl5 keinen scope , das our daher zwecklos, für solche manöver musst du schon perl6 nehmen
Wiki:Tutorien in der Wiki, mein zeug:
kephra, baumhaus, garten, gezwitscher

Es beginnt immer mit einer Entscheidung.
topeg
 2006-11-18 06:33
#69027 #69027
User since
2006-07-10
2611 Artikel
BenutzerIn

user image
Ich weiß, hatte ich auch nur wegen der "Übersichtlichkeit" gemacht. Ist sicher Ansichtsache. :-)
ptk
 2006-11-18 14:32
#69028 #69028
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Nimm doch lieber eine anonyme Subroutine.
Code: (dl )
1
2
3
4
5
my $rcu;
$rcu = sub {
...
$rcu->(...);
};
bloonix
 2006-11-18 18:17
#69029 #69029
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
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 CPAN: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
Code: (dl )
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
Code: (dl )
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 CPAN: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.
bloonix
 2006-11-18 18:31
#69030 #69030
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=ptk,17.11.2006, 22:10]Noch mehr Module findest du auf http://web.archive.org/web/20060507091304/http://idisk.mac.com/christian.hansen/Public/perl/serialize.pl (leider macht die Forumsoftware den Link kaputt...), zusammen mit Benchmarks. Convert::Bencode_XS sieht sehr interessant. Storable ist aber unschlagbar, was die unterstützten Perl-Daten angeht. Man hat keine Probleme mit utf8- vs. nicht-utf8-Strings, man kann sogar Subroutinen serialisieren, wenn man möchte.[/quote]
Japp, CPAN:Storable bleibt auch mein Favorit, aber ich
muss die Daten irgendwie übertragen und auf SSL möchte ich nicht
verzichten, aber bislang kenne ich nichts anderes als CPAN:IO::Socket::SSL.

Kennst du eventuell noch andere SSL Lösungen? Ansonsten versuche ich
es mal mit CPAN:Convert::Bencode_XS. :(
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.
ptk
 2006-11-18 21:23
#69031 #69031
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wo glaubst du, dass der Bug ist? In Storable oder IO::Socket::SSL?
bloonix
 2006-11-18 21:48
#69032 #69032
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Ich schätze eher in IO::Socket::SSL, da die Datenübertragung mit
IO::Socket::INET und auch über eine Fifo (mknod p) funktioniert (siehe
Beispiel).

IO::Socket::SSL basiert ja auf IO::Socket::INET, also scheint der Fehler wohl
bei der Verschlüsselung zu liegen. Da läuft irgendwas schief.\n\n

<!--EDIT|opi|1163879314-->
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.
ptk
 2006-11-18 22:47
#69033 #69033
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Deshalb glaube ich ja nicht, dass die Verwendung von Convert::Bencode_XS dein Problem lösen würde. Einzig die Tatsache, dass Storable mehr "binäre" Zeichen bei der Serialisierung als Bencode verwendet, und diese Zeichen IO::Socket::SSL vielleicht durcheinander bringen.
<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten



View all threads created 2006-08-20 07:23.