Schrift
[thread]8249[/thread]

Hash Struktur senden: Client - Server (Seite 3)

Leser: 1


<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten
bloonix
 2006-11-18 23:41
#69034 #69034
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Hmmm... klingt nicht gut. Gibt es eine alternative zu IO::Socket::SSL ?
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-19 01:15
#69035 #69035
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Ich habe jetzt ein paar Stündchen noch rumgespielt, weil ganz plötzlich
die Übertragung der Daten via IO::Socket::SSL und Storable funktionierte
und bin auf was seltsames gestoßen.

Code: (dl )
1
2
my %hash1 = ( a => 1 );
my %hash2 = ( a => '1' );


%hash1 lässt sich sauber übertragen, %hash2 nicht. Das ist echt verflucht!

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
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
use strict;
use warnings;

package Server;

use IO::Socket::SSL;
use Linux::Statistics;
use Storable qw(nfreeze);

unless (-d "certs") {
   if (-d "../certs") {
       chdir "..";
   } else {
       die "Please run this example from the IO::Socket::SSL distribution directory!\n";
   }
}

sub run {
  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 "server: can't open socket over port 9000";

  warn "server initialized\n";

  while (my $client = $socket->accept()) {
     chomp (my $request = <$client>);
     next unless $request;
     warn "client request: $request\n";

     my %hash1 = ( a => 1 );
     my %hash2 = ( 1, 2, 3, 4 );
     my %hash3 = ( a => '1' );
     my $dump1 = nfreeze \%hash1;
     my $dump2 = nfreeze \%hash2;
     my $dump3 = nfreeze \%hash3;

     print $client $dump1;
     print $client "\n";
     print $client $dump2;
     print $client "\n";
     print $client $dump3;
     close($client);
     close($socket);
  }
}

package Client;

use IO::Socket::SSL;
use Storable qw(thaw);
use Data::Dumper;
use Safe;

sub run {
  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 "client: can't connect to 127.0.0.1:9000";

  my $safe = new Safe;

  $safe->permit(qw(:default require));

  {
     no warnings 'once';
     $Storable::Deparse = 1;
     $Storable::Eval = sub { $safe->reval($_[0]) };
  }

  warn "client connected to server\n";
  print $socket "hash\n";
  my $dump1 = <$socket>;
  my $dump2 = <$socket>;
  my $dump3 = <$socket>;
  my $data1 = thaw($dump1);
  my $data2 = thaw($dump2);
  my $data3 = thaw($dump3);
  close($socket);
  warn Dumper($data1);
  warn Dumper($data2);
  warn Dumper($data3);
}

1;

if (my $pid = fork) {
  run Server;
  waitpid($pid,0);
} else {
  sleep 1;
  run Client;
}


Die Ausgabe ist:

server initialized
client connected to server
client request: hash
$VAR1 = {
         'a' => 1
       };
$VAR1 = {
         '1' => 2,
         '3' => 4
       };
$VAR1 = undef;


Natürlich werden Strings auch mit Hochkomma oder doppelten
Hochkomma umschlossen und dann wird der ganze Hash einfach nicht
übertragen. Das ist echt zum verrückt werden.

Ich glaube aber trotzdem nicht, dass das Problem an Storable liegt, da ich
den Hash problemlos im gleichen Skript freeze'n und thaw'n kann und auch
über IO::Socket::INET.\n\n

<!--EDIT|opi|1163891933-->
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-19 01:24
#69036 #69036
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
@ptk, Bencode_XS funktioniert einwandfrei. Die Daten werden komplett
übertragen.
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-19 12:39
#69037 #69037
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Das spricht alles für die Theorie, dass es Zeichen gibt, die von ...::SSL nicht korrekt übertragen werden. Benutzt du zufällig ein perl 5.8.0 mit einem utf8-Locale? Oder hast du PERL_UNICODE gesetzt?
bloonix
 2006-11-19 13:26
#69038 #69038
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=ptk,19.11.2006, 11:39]Das spricht alles für die Theorie, dass es Zeichen gibt, die von ...::SSL nicht korrekt übertragen werden. Benutzt du zufällig ein perl 5.8.0 mit einem utf8-Locale?[/quote]

Korrekt!

#> locale
LANG=de_DE.UTF-8


[quote=ptk,19.11.2006, 11:39]Oder hast du PERL_UNICODE gesetzt?[/quote]

Nein, aber so ganz verstehe ich das nicht. IO::Socket::SSL erhält binäre
Daten, also sollte das doch eigentlich unerheblich sein?!
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-19 19:13
#69039 #69039
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
perl5.8.0 schaltet für sämtliche I/O-Operationen den utf8-Layer an, falls nicht explizit mit binmode(...) etwas anderes verlangt wird. Versuch mal, LANG=C zu setzen, und ggfs. auch andere locale-Variablen wie LC_ALL und LC_CTYPE.
bloonix
 2006-11-19 19:59
#69040 #69040
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
[quote=ptk,19.11.2006, 18:13]perl5.8.0 schaltet für sämtliche I/O-Operationen den utf8-Layer an, falls nicht explizit mit binmode(...) etwas anderes verlangt wird. Versuch mal, LANG=C zu setzen, und ggfs. auch andere locale-Variablen wie LC_ALL und LC_CTYPE.[/quote]
#> export LANG=C
#> export LC_ALL=C
#> locale
LANG=C
LC_CTYPE="C"
LC_NUMERIC="C"
LC_TIME="C"
LC_COLLATE="C"
LC_MONETARY="C"
LC_MESSAGES="C"
LC_PAPER="C"
LC_NAME="C"
LC_ADDRESS="C"
LC_TELEPHONE="C"
LC_MEASUREMENT="C"
LC_IDENTIFICATION="C"
LC_ALL=C


Ich habe es auch mit "no utf8;" und -C0 im Shebang versucht, um utf8
zu disablen, ohne Erfolg. Vielleicht liegt es auch einfach an den binären
Daten. Wie schon geschrieben, funktioniert die Übertragung des Hashs
mit Bencode_XS, Data::Dumper, JSON etc., nur nicht mit Storable, wo
die Daten binär sind. =(

Kennst du eine andere Lösung als IO::Socket::SSL?\n\n

<!--EDIT|opi|1163959221-->
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-19 20:30
#69041 #69041
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Sorry, nein. Evtl. kannst du alternativ etwas mit dem Kommandozeilentool openssl (openssl s_client ...) machen.
bloonix
 2006-11-20 14:23
#69042 #69042
User since
2005-12-17
1615 Artikel
HausmeisterIn
[Homepage]
user image
Okay, danke für deine Hilfe! Ich werde dann auf die Antwort des Autors von
IO::Socket::SSL abwarten und bis dahin mit Bencode_XS arbeiten.\n\n

<!--EDIT|opi|1164026440-->
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-29 01:36
#69043 #69043
User since
2003-11-28
3645 Artikel
ModeratorIn
[default_avatar]
Wahrscheinlich hat das nichts mit deinem Problem zu tun, aber vor kurzem bin ich daran gescheitert, Storable-Daten, die über ein HTTP-Post-Request geschickt wurden, mit Apache::Request auszulesen. Anscheinend kann Apache::Request mit den eingebetteten \0-Bytes nichts anfangen. Mein Fix war es, die Daten in Base64 einzupacken.
<< |< 1 2 3 4 >| >> 31 Einträge, 4 Seiten



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