diff --git a/src/proxymain.c b/src/proxymain.c index 4198f61..ce0630a 100644 --- a/src/proxymain.c +++ b/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; } }