diff --git a/gate/main.c b/gate/main.c index 553e0d53..388d0407 100644 --- a/gate/main.c +++ b/gate/main.c @@ -215,9 +215,7 @@ _cb(struct skynet_context * ctx, void * ud, int type, int session, uint32_t sour assert(type == PTYPE_RESPONSE); struct mread_pool * m = g->pool; int connection_id = mread_poll(m,100); // timeout : 100ms - if (connection_id < 0) { - skynet_command(ctx, "TIMEOUT", "1"); - } else { + if (connection_id >= 0) { int id = g->map[connection_id].uid; if (id == 0) { id = _gen_id(g, connection_id); @@ -254,9 +252,9 @@ _cb(struct skynet_context * ctx, void * ud, int type, int session, uint32_t sour _forward(ctx, g, id, data, len); mread_yield(m); -_break: - skynet_command(ctx, "TIMEOUT", "0"); } +_break: + skynet_command(ctx, "TIMEOUT", "0"); return 0; } diff --git a/service-src/service_socket.c b/service-src/service_socket.c index 2bdb54b6..3123b829 100644 --- a/service-src/service_socket.c +++ b/service-src/service_socket.c @@ -234,32 +234,36 @@ parser(const char * msg, int sz, char * buffer, int *id) { static void forward(struct skynet_context * context, struct socket *s, struct socket_pool *p) { - int * buffer = malloc(READ_BUFFER + sizeof(int)); - *buffer = s->id; // convert endian ? - int r = 0; for (;;) { - r = read(s->fd, buffer+1, READ_BUFFER); - if (r == -1) { - switch(errno) { - case EWOULDBLOCK: - free(buffer); - return; - case EINTR: - continue; + int * buffer = malloc(READ_BUFFER + sizeof(int)); + *buffer = s->id; // convert endian ? + int r = 0; + for (;;) { + r = read(s->fd, buffer+1, READ_BUFFER); + if (r == -1) { + switch(errno) { + case EWOULDBLOCK: + free(buffer); + return; + case EINTR: + continue; + } + r = 0; + break; } - r = 0; break; } - break; - } - if (r == 0) { - force_close(s,p); - } + if (r == 0) { + force_close(s,p); + } - if (s->status == STATUS_HALFCLOSE) { - free(buffer); - } else { - skynet_send(context, 0, s->source, PTYPE_CLIENT | PTYPE_TAG_DONTCOPY, 0, buffer, r + 4); + if (s->status == STATUS_HALFCLOSE) { + free(buffer); + } else { + skynet_send(context, 0, s->source, PTYPE_CLIENT | PTYPE_TAG_DONTCOPY, 0, buffer, r + 4); + } + if (r < READ_BUFFER) + return; } } @@ -391,7 +395,7 @@ _cb(struct skynet_context * context, void * ud, int type, int session, uint32_t } } } - skynet_command(context, "TIMEOUT", n == MAX_EVENT ? "0" : "1"); + skynet_command(context, "TIMEOUT", "0"); return 0; }