Tony, on one hand, it was the decoder... you were right. Thank you.
On the other hand, it was a layer 8 problem. I was using telnet to play with POE, but unfortunately, typing a single character was not enough to get 4 bytes to read the length from :-( Thanks again. Regards Stefan > -----Original Message----- > From: Tony Cook [mailto:t...@develop-help.com] > Sent: Sunday, June 20, 2010 11:24 AM > To: Stefan is using POE > Cc: poe@perl.org > Subject: Re: Question on using Filter::Block > > On Sun, Jun 20, 2010 at 09:31:48AM +0200, Stefan is using POE wrote: > > Hello, > ... > > > > My Data are starting with a header, containing the message length in > byte 2 > > to 4 of my packet. > > > > My current design (plain IO::Socket): > > > > Reading: I'm reading the first 4 bytes (local $/= \4), take the > length from > > bytes 2-4 and then read the rest, which is $lengths-4. > > > > Writing: writing to the client, I build the complete packet and put > it on > > the line. very basic, but it works. > > > > > > > > I'm sure, POE will give a better way of doing this. > > > > I thought, I could use POE::Filter::Block, but this seems to need > static > > block sizes or the length-prepended configuration, which I do not > understand > > L to use. > > > > > > > > As a hint: in the first byte of the packet, there is always 0x07, so > it > > would be feasible to calculate the length from the first 4 bytes, > > subtracting 0x0700000 from it ?!? > ... > > > > sub stefans_decoder { > > > > my $stuff = shift; > > > > $$stuff =~ /^(.)(...)/; > > > > return hex($2); > > > > } > > Is the data encoded as hex or in binary? From your note above it > appears to be in binary, but you're treating it as a hex string here. > > Perhaps: > > sub decoder { > my $stuff = shift; > > length $$stuff >= 4 or return; # not enough to use > > my @head = unpack "C*", substr($$stuff, 0, 4, ""); > > # is it big or little endian? > return $head[1] * 0x10000 + $head[2] * 0x100 + $head[3]; > } > > > sub stefans_encoder { > > > > my $stuff = shift; > > > > substr($$stuff, 0, 0) = "\7" . sprintf("%06x", length($$stuff)); > > > > return; > > > > } > > You're trying to fit 6 characters into a 3 byte buffer here, I guess > it is in binary. Maybe something like: > > sub encoder { > my $stuff = shift; > > my $len = length $$stuff; > substr($$stuff, 0, 0) = "\x07" + pack("C*", unpack("H*", > sprintf("%06x", $len))); > > return; > } > > Tony