mirror of
https://github.com/3proxy/3proxy.git
synced 2025-02-24 02:55:40 +08:00
better listen/connection accept errors handling
This commit is contained in:
parent
c538d0c2f8
commit
3e6b230128
@ -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);
|
||||||
param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)¶m->sinsr, &size);
|
for(i=0; i<3; i++){
|
||||||
if(param->remsock == INVALID_SOCKET) {
|
param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)¶m->sinsr, &size);
|
||||||
param->res = 13;
|
if(param->remsock == INVALID_SOCKET) {
|
||||||
param->srv->logfunc(param, "Connect back accept() failed");
|
param->res = 13;
|
||||||
freeparam(param);
|
param->srv->logfunc(param, "Connect back accept() failed");
|
||||||
#ifdef _WIN32
|
continue;
|
||||||
return 0;
|
}
|
||||||
#else
|
|
||||||
return NULL;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
#ifndef WITHMAIN
|
#ifndef WITHMAIN
|
||||||
memcpy(¶m->req, ¶m->sinsr, size);
|
memcpy(¶m->req, ¶m->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
|
||||||
}
|
if(so._sendto(param->remsock, "C", 1, 0, (struct sockaddr*)¶m->sinsr, size) != 1){
|
||||||
#endif
|
param->srv->logfunc(param, "Connect back sending command failed");
|
||||||
if(so._sendto(param->remsock, "C", 1, 0, (struct sockaddr*)¶m->sinsr, size) != 1){
|
so._closesocket(param->remsock);
|
||||||
param->srv->logfunc(param, "Connect back sending command failed");
|
param->remsock = INVALID_SOCKET;
|
||||||
freeparam(param);
|
continue;
|
||||||
#ifdef _WIN32
|
}
|
||||||
return 0;
|
|
||||||
#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;
|
||||||
|
@ -1,2 +1,2 @@
|
|||||||
#define VERSION "3proxy-0.8b-devel"
|
#define VERSION "3proxy-0.8b-devel"
|
||||||
#define BUILDDATE "150920223529"
|
#define BUILDDATE "150924011516"
|
||||||
|
Loading…
Reference in New Issue
Block a user