mom040267 пре 11 година
родитељ
комит
114257e872
1 измењених фајлова са 28 додато и 4 уклоњено
  1. 28 4
      src/apps/relay/ns_ioalib_engine_impl.c

+ 28 - 4
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)) {