Parcourir la source

Handle accept() errors more accurate

z3APA3A il y a 10 ans
Parent
commit
95efeb8a93
1 fichiers modifiés avec 42 ajouts et 2 suppressions
  1. 42 2
      src/proxymain.c

+ 42 - 2
src/proxymain.c

@@ -524,6 +524,7 @@ int MODULEMAINFUNC (int argc, char** argv){
 		}
 	}
 	if((conf.paused != srv.version) || (error < 0)) break;
+	error = 0;
 	if(!isudp){
 		size = sizeof(defparam.sincr);
 		if(iscbc){
@@ -551,8 +552,47 @@ int MODULEMAINFUNC (int argc, char** argv){
 		else {
 			new_sock = so._accept(sock, (struct sockaddr*)&defparam.sincr, &size);
 			if(new_sock == INVALID_SOCKET){
-				sprintf((char *)buf, "accept(): %s", strerror(errno));
-				if(!srv.silent)(*srv.logfunc)(&defparam, buf);
+#ifdef _WIN32
+				switch(WSAGetLastError()){
+				case WSAEMFILE:
+				case WSAENOBUFS:
+				case WSAENETDOWN:
+					usleep(SLEEPTIME * 10);
+					break;
+				case WSAEINTR:
+					error = 1;
+					break;
+				default:
+					break;
+				}
+
+#else
+				switch (errno){
+#ifdef EMFILE
+				case EMFILE:
+#endif
+#ifdef ENFILE
+				case ENFILE:
+#endif
+#ifdef ENOBUFS
+				case ENOBUFS:
+#endif
+#ifdef ENOMEM
+				case ENOMEM:
+#endif
+					usleep(SLEEPTIME * 10);
+					break;
+
+				default:
+					break;
+				}
+#endif
+				nlog++;			
+				if(error || nlog > 5000) {
+					sprintf((char *)buf, "accept(): %s", strerror(errno));
+					if(!srv.silent)(*srv.logfunc)(&defparam, buf);
+					nlog = 0;
+				}
 				continue;
 			}
 		}