From 114257e872eaac404cdf1b5332eacd9264fc76d4 Mon Sep 17 00:00:00 2001 From: mom040267 Date: Wed, 23 Apr 2014 21:34:16 +0000 Subject: [PATCH] more fixes for issue 123 --- src/apps/relay/ns_ioalib_engine_impl.c | 32 ++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) diff --git a/src/apps/relay/ns_ioalib_engine_impl.c b/src/apps/relay/ns_ioalib_engine_impl.c index 07f86afa..b96d283f 100644 --- a/src/apps/relay/ns_ioalib_engine_impl.c +++ b/src/apps/relay/ns_ioalib_engine_impl.c @@ -2530,8 +2530,10 @@ static void socket_input_handler(evutil_socket_t fd, short what, void* arg) ioa_socket_handle s = (ioa_socket_handle)arg; - if(!s) + if(!s) { + read_spare_buffer(fd); return; + } if((s->magic != SOCKET_MAGIC)||(s->done)) { read_spare_buffer(fd); @@ -2547,6 +2549,8 @@ static void socket_input_handler(evutil_socket_t fd, short what, void* arg) if (!ioa_socket_tobeclosed(s)) socket_input_worker(s); + else + read_spare_buffer(fd); if((s->magic != SOCKET_MAGIC)||(s->done)) { TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "!!!%s (1) on socket, ev=%d: 0x%lx, st=%d, sat=%d\n", __FUNCTION__,(int)what,(long)s, s->st, s->sat); @@ -2645,30 +2649,50 @@ static void socket_output_handler_bev(struct bufferevent *bev, void* arg) } } +static int read_spare_buffer_bev(struct bufferevent *bev) +{ + if(bev) { + char some_buffer[8192]; + bufferevent_read(bev, some_buffer, sizeof(some_buffer)); + } + return 0; +} + static void socket_input_handler_bev(struct bufferevent *bev, void* arg) { - if (bev && arg) { + if (bev) { + + if(!arg) { + read_spare_buffer_bev(bev); + return; + } ioa_socket_handle s = (ioa_socket_handle) arg; if(bev != s->bev) { TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "!!! %s socket: 0x%lx: wrong bev\n", __FUNCTION__,(long)s); + read_spare_buffer_bev(bev); return; } if((s->magic != SOCKET_MAGIC)||(s->done)) { TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "!!!%s on socket: 0x%lx, st=%d, sat=%d\n", __FUNCTION__, (long) s, s->st, s->sat); TURN_LOG_FUNC(TURN_LOG_LEVEL_INFO, "!!! %s socket: 0x%lx was closed\n", __FUNCTION__,(long)s); + read_spare_buffer_bev(bev); return; } { size_t cycle = 0; - while (!ioa_socket_tobeclosed(s) && (cycle++<64)) { + do { + if(ioa_socket_tobeclosed(s)) { + read_spare_buffer_bev(bev); + break; + } if (socket_input_worker(s) <= 0) break; - } + } while(cycle++<128); } if((s->magic != SOCKET_MAGIC)||(s->done)) {