On Mon, Feb 09, 2004 at 10:56:25AM -0600, Jay Strauss wrote:
> Hi,
> 
> I'd like rewrite some forking code to use POE instead.
> 
> I must connect to a server process via a tcp socket.  The messages I
> receive, are not terminated, but the individual fields are terminated by an
> ASCII 0.
> 
> The first field received (message type), then tells me how many more fields
> I must read to get the entire message.
> 
> In my current code I do it sorta like:
> 
> while (1) {
>     my $msgId   = $self->receive;
>     if ($msgId == TICKPRICE) {$self->readTickPriceMessage}
>     ...
> }
> 
> sub readTickPriceMessage {
>     my $self = shift;
>     my @field = $self->receive() for (qw/tickerid tickType price/);
> }
> 
> sub receive {
>     my $self = shift;
>     my $s = $self->socket;
> 
>     my ($result,$byte);
> 
>     while (sysread($s, $byte, 1) == 1) {
>         last if ord($byte) == 0;
>         $result .= $byte;
>     }
>     return $result;
> }
> 
> 
> But I'm trying to figure out how I'd do it with POE::Wheel::SocketFactory +
> POE::Wheel::ReadWrite.  It seems like I'm only going to get an event on the
> initial connection.  How would I get it to sit and listen on the socket for
> messages?  Furthermore, how would I get it to read a specific number of
> fields based on the message ID?

SocketFactory just creates sockets.  In the client context, it performs
the socket creation and connection, returning a socket to you when it's
established (or an error event if there was a problem).

At that point you delete the SocketFactory wheel and create a ReadWrite
wheel to perform buffered I/O on the socket.

I would use POE::Filter::Line with the literal line terminator "\0".
That will return to you a stream of parsed fields.  It's then up to you
to decide how many constitute a complete record.  You could build a list
of fields until @record == $record_length{$record[0]} or something.  At
that point, you call whatever you've written to handle the record.

-- 
Roccco aputo - [EMAIL PROTECTED] - http://poe.perl.org/

Reply via email to