|
@@ -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);
|
|
|
|
|
- if(param->remsock == INVALID_SOCKET) {
|
|
|
|
|
- param->res = 13;
|
|
|
|
|
- param->srv->logfunc(param, "Connect back accept() failed");
|
|
|
|
|
- freeparam(param);
|
|
|
|
|
-#ifdef _WIN32
|
|
|
|
|
- return 0;
|
|
|
|
|
-#else
|
|
|
|
|
- return NULL;
|
|
|
|
|
-#endif
|
|
|
|
|
- }
|
|
|
|
|
|
|
+ for(i=0; i<3; i++){
|
|
|
|
|
+ param->remsock = so._accept(param->srv->cbsock, (struct sockaddr*)¶m->sinsr, &size);
|
|
|
|
|
+ if(param->remsock == INVALID_SOCKET) {
|
|
|
|
|
+ param->res = 13;
|
|
|
|
|
+ param->srv->logfunc(param, "Connect back accept() failed");
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
#ifndef WITHMAIN
|
|
#ifndef WITHMAIN
|
|
|
- memcpy(¶m->req, ¶m->sinsr, size);
|
|
|
|
|
- if(param->srv->acl) param->res = checkACL(param);
|
|
|
|
|
- if(param->res){
|
|
|
|
|
- param->srv->logfunc(param, "Connect back ACL failed");
|
|
|
|
|
- freeparam(param);
|
|
|
|
|
-#ifdef _WIN32
|
|
|
|
|
- return 0;
|
|
|
|
|
-#else
|
|
|
|
|
- return NULL;
|
|
|
|
|
-#endif
|
|
|
|
|
- }
|
|
|
|
|
-#endif
|
|
|
|
|
- if(so._sendto(param->remsock, "C", 1, 0, (struct sockaddr*)¶m->sinsr, size) != 1){
|
|
|
|
|
- param->srv->logfunc(param, "Connect back sending command failed");
|
|
|
|
|
- freeparam(param);
|
|
|
|
|
-#ifdef _WIN32
|
|
|
|
|
- return 0;
|
|
|
|
|
-#else
|
|
|
|
|
- return NULL;
|
|
|
|
|
|
|
+ memcpy(¶m->req, ¶m->sinsr, size);
|
|
|
|
|
+ if(param->srv->acl) param->res = checkACL(param);
|
|
|
|
|
+ if(param->res){
|
|
|
|
|
+ param->srv->logfunc(param, "Connect back ACL failed");
|
|
|
|
|
+ so._closesocket(param->remsock);
|
|
|
|
|
+ param->remsock = INVALID_SOCKET;
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
#endif
|
|
#endif
|
|
|
- }
|
|
|
|
|
|
|
+ if(so._sendto(param->remsock, "C", 1, 0, (struct sockaddr*)¶m->sinsr, size) != 1){
|
|
|
|
|
+ param->srv->logfunc(param, "Connect back sending command failed");
|
|
|
|
|
+ so._closesocket(param->remsock);
|
|
|
|
|
+ param->remsock = INVALID_SOCKET;
|
|
|
|
|
+ continue;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
|
|
+ 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;
|