Thread Hash per socket übergeben (14 answers)
Opened by worst_case at 2010-08-09 18:08

rosti
 2011-03-22 15:43
#146782 #146782
User since
2011-03-19
3492 Artikel
BenutzerIn
[Homepage]
user image
2010-08-09T16:08:43 worst_case
kann ich ein Hash per Socket von einem Perlscript zum anderen (Client-> Server) übergeben. Bis jetzt ist mir nur String bekannt, den ich aus dem Hash erzeuge und dann wieder zum Hash umwandle. Soweit funktioniert alles Prima.
Vielleicht gibt es auch eine Art "join" die mir aus einem String "Hans:123,Otto:456" ein hash generiert ??


Also ich serialisiere gerne auf byte-Ebene ;)
Storable.pm ist ok. Zum Selbermachen, zwei Algorithmen:

-packe key und value in Records mit fest vorgegebener Länge like this:
Code: (dl )
$rec = pack "Z255Z255", $key, $value;


Wiederherstellen:
- Lese aus dem Socket Sequenzen mit jeweils 510 Byte (255 + 255)
Code: (dl )
1
2
3
while(read $socket, my $bin, 510){
my($k,$v) = unpack "Z255Z255", $bin; # same Template as above
}


Bei Schablone "Z" ist zu beachten, dass das letzte Byte für eine \0 reserviert ist.

Nun kann das aber ggf. länger werden (viele Nullern)... Algorithmus 2:
- Verwende Records mit variabler Länge

Zum Serialisieren werden key/value immer paarweise in das Socket geschrieben als
4 byte die Länge des key, der key selbst (bytes), 4 byte die Länge des value, die bytes des value.

Diese 4 byte bekommst Du mit
Code: (dl )
$len4 = pack "N", length, $key;


Das ist dann eine schöne dichte Packung ;)

Warum Serialize auf Byte-Ebene? Du bist damit unabhängig von jedwelchen Zeichenkodierungen, musst also nicht überlegen "hat das 'ä' jetzt ein oder zwei byte...", das wird auf Byte-Ebene eben so übertragen, wie es reinkommt und die length()-Funktion liefert im Ergebnis 2 byte, sofern kein Pragma utf8 gesetzt wurde und das 'ä' utf8-kodiert reinkommt.

Zum Verständnis:
Code: (dl )
1
2
3
4
5
# wir haben ein utf8-kodiertes 'ä'
use utf8; # zeichenorientiert
print length 'ä'; # 1
no utf8; # byteorientiert
print length 'ä'; # 2


--Rolf

PS: Möglicherweise ist Pragma utf8 in neueren Perlversionen nicht mehr empfohlen oder ganz raus.

View full thread Hash per socket übergeben