better listen/connection accept errors handling

This commit is contained in:
z3APA3A 2015-09-24 01:17:50 +03:00
parent c538d0c2f8
commit 3e6b230128
2 changed files with 40 additions and 33 deletions

View File

@ -15,44 +15,42 @@ DWORD WINAPI threadfunc(LPVOID p) {
#else #else
void * threadfunc (void *p) { void * threadfunc (void *p) {
#endif #endif
int i = 0;
if(param->srv->cbsock != INVALID_SOCKET){ if(param->srv->cbsock != INVALID_SOCKET){
SASIZETYPE size = sizeof(param->sinsr); SASIZETYPE size = sizeof(param->sinsr);
for(i=0; i<3; i++){
param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)&param->sinsr, &size); param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)&param->sinsr, &size);
if(param->remsock == INVALID_SOCKET) { if(param->remsock == INVALID_SOCKET) {
param->res = 13; param->res = 13;
param->srv->logfunc(param, "Connect back accept() failed"); param->srv->logfunc(param, "Connect back accept() failed");
freeparam(param); continue;
#ifdef _WIN32
return 0;
#else
return NULL;
#endif
} }
#ifndef WITHMAIN #ifndef WITHMAIN
memcpy(&param->req, &param->sinsr, size); memcpy(&param->req, &param->sinsr, size);
if(param->srv->acl) param->res = checkACL(param); if(param->srv->acl) param->res = checkACL(param);
if(param->res){ if(param->res){
param->srv->logfunc(param, "Connect back ACL failed"); param->srv->logfunc(param, "Connect back ACL failed");
freeparam(param); so._closesocket(param->remsock);
#ifdef _WIN32 param->remsock = INVALID_SOCKET;
return 0; continue;
#else
return NULL;
#endif
} }
#endif #endif
if(so._sendto(param->remsock, "C", 1, 0, (struct sockaddr*)&param->sinsr, size) != 1){ if(so._sendto(param->remsock, "C", 1, 0, (struct sockaddr*)&param->sinsr, size) != 1){
param->srv->logfunc(param, "Connect back sending command failed"); param->srv->logfunc(param, "Connect back sending command failed");
freeparam(param); so._closesocket(param->remsock);
#ifdef _WIN32 param->remsock = INVALID_SOCKET;
return 0; continue;
#else
return NULL;
#endif
} }
break;
} }
}
if(i == 3){
freeparam(param);
}
else {
((struct clientparam *) p)->srv->pf((struct clientparam *)p); ((struct clientparam *) p)->srv->pf((struct clientparam *)p);
}
#ifdef _WIN32 #ifdef _WIN32
return 0; return 0;
#else #else
@ -444,8 +442,10 @@ int MODULEMAINFUNC (int argc, char** argv){
fcntl(sock,F_SETFL,O_NONBLOCK); fcntl(sock,F_SETFL,O_NONBLOCK);
#endif #endif
srv.srvsock = sock; srv.srvsock = sock;
opt = 1;
if(so._setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&opt, sizeof(int)))perror("setsockopt()"); if(so._setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&opt, sizeof(int)))perror("setsockopt()");
#ifdef SO_REUSEPORT #ifdef SO_REUSEPORT
opt = 1;
so._setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int)); so._setsockopt(sock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int));
#endif #endif
} }
@ -480,6 +480,13 @@ int MODULEMAINFUNC (int argc, char** argv){
(*srv.logfunc)(&defparam, "Failed to allocate connect back socket"); (*srv.logfunc)(&defparam, "Failed to allocate connect back socket");
return -6; return -6;
} }
opt = 1;
so._setsockopt(srv.cbsock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&opt, sizeof(int));
#ifdef SO_REUSEPORT
opt = 1;
so._setsockopt(srv.cbsock, SOL_SOCKET, SO_REUSEPORT, (unsigned char *)&opt, sizeof(int));
#endif
if(so._bind(srv.cbsock, (struct sockaddr*)&cbsa, sizeof(cbsa))==-1) { if(so._bind(srv.cbsock, (struct sockaddr*)&cbsa, sizeof(cbsa))==-1) {
(*srv.logfunc)(&defparam, "Failed to bind connect back socket"); (*srv.logfunc)(&defparam, "Failed to bind connect back socket");
return -7; return -7;

View File

@ -1,2 +1,2 @@
#define VERSION "3proxy-0.8b-devel" #define VERSION "3proxy-0.8b-devel"
#define BUILDDATE "150920223529" #define BUILDDATE "150924011516"