On Sun, Aug 29, 2010 at 08:08:12AM -0700, Gilad Benjamini wrote:
> My eventloop needs to go through this cycle
>    - Read 16 bytes off the network
>    - The 16 bytes contain a length parameter
>    - Read additional "length" bytes from the network.
> 
> It seems that this can be done with a buffered event which keeps changing
> the read low watermark (twice per message).
> Is this a "proper" way to use buffered events ?
> 

Yes, bufferevents are fine for this, this abstracts some of the hard
work. I do the same thing in one of my applications. Something along
the lines of:

struct frame {
        uint16_t something;
  uint16_t length;
};

size_t frame_length = 4;

buf = bufferevent_get_input(bev);

while (evbuffer_get_length(buf) > 0) {
  unsigned char *data;
        unsigned char *payload;
        struct frame   frame;

        data = evbuffer_pullup(buf, frame_length);

        if (evbuffer_get_length(data) < frame_length) {
          /* we don't have enough data yet to fill in our frame, return and 
wait for more */
                break;
        }

        memcpy((char *)&frame.something, data, sizeof(uint16_t));
  memcpy((char *)&frame.length, &data[sizeof(uint16_t)], sizeof(uint16_t))/

        if ((evbuffer_get_length(buf) - frame_length) < frame.length) {
                /* whole payload hasn't been seen */
                break;
        }

        /* drain the header portion from the evbuffer */
        evbuffer_drain(buf, frame_length);

        if (!(payload = malloc(frame.length))) {
                perror("malloc");
                return;
        }

        evbuffer_remove_buffer(buf, payload, frame.length); 
}
        
(not tested, just real quick example I could come up with)
***********************************************************************
To unsubscribe, send an e-mail to majord...@freehaven.net with
unsubscribe libevent-users    in the body.

Reply via email to