diff --git a/service-src/databuffer.h b/service-src/databuffer.h index 67b277d4..b4b7783a 100644 --- a/service-src/databuffer.h +++ b/service-src/databuffer.h @@ -88,8 +88,8 @@ databuffer_read(struct databuffer *db, struct messagepool *mp, void * buffer, in } } -static int -databuffer_push(struct databuffer *db, struct messagepool *mp, int header_size,void *data, int sz) { +static void +databuffer_push(struct databuffer *db, struct messagepool *mp, void *data, int sz) { struct message * m; if (mp->freelist) { m = mp->freelist; @@ -120,7 +120,10 @@ databuffer_push(struct databuffer *db, struct messagepool *mp, int header_size,v db->tail->next = m; db->tail = m; } +} +static int +databuffer_readheader(struct databuffer *db, struct messagepool *mp, int header_size) { if (db->header == 0) { // parser header (2 or 4) if (db->size < header_size) { diff --git a/service-src/service_gate.c b/service-src/service_gate.c index 0bd874af..384802e5 100644 --- a/service-src/service_gate.c +++ b/service-src/service_gate.c @@ -183,10 +183,15 @@ _forward(struct gate *g, struct connection * c, int size) { static void dispatch_message(struct gate *g, struct connection *c, int id, void * data, int sz) { - int size = databuffer_push(&c->buffer,&g->mp, g->header_size, data, sz); - if (size > 0) { - _forward(g, c, size); - databuffer_reset(&c->buffer); + databuffer_push(&c->buffer,&g->mp, data, sz); + for (;;) { + int size = databuffer_readheader(&c->buffer, &g->mp, g->header_size); + if (size < 0) { + return; + } else if (size > 0) { + _forward(g, c, size); + databuffer_reset(&c->buffer); + } } }