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.