mirror of
https://github.com/3proxy/3proxy.git
synced 2025-02-24 02:55:40 +08:00
Add timeout for connect in all modules
This commit is contained in:
parent
3c9ff54ae8
commit
e2884b182a
@ -1090,7 +1090,7 @@ unsigned long udpresolve(int af, unsigned char * name, unsigned char * value, un
|
|||||||
*sinsr = nservers[i].addr;
|
*sinsr = nservers[i].addr;
|
||||||
}
|
}
|
||||||
if(usetcp){
|
if(usetcp){
|
||||||
if(so._connect(sock,(struct sockaddr *)sinsr,SASIZE(sinsr))) {
|
if(connectwithpoll(sock,(struct sockaddr *)sinsr,SASIZE(sinsr))) {
|
||||||
so._shutdown(sock, SHUT_RDWR);
|
so._shutdown(sock, SHUT_RDWR);
|
||||||
so._closesocket(sock);
|
so._closesocket(sock);
|
||||||
break;
|
break;
|
||||||
|
38
src/common.c
38
src/common.c
@ -648,6 +648,27 @@ void logsyslog(struct clientparam * param, const unsigned char *s) {
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size){
|
||||||
|
struct pollfd fds[1];
|
||||||
|
#ifdef _WIN32
|
||||||
|
unsigned long ul = 1;
|
||||||
|
ioctlsocket(sock, FIONBIO, &ul);
|
||||||
|
#else
|
||||||
|
fcntl(sock,F_SETFL,O_NONBLOCK);
|
||||||
|
#endif
|
||||||
|
if(so._connect(sock,sa,size)) {
|
||||||
|
if(errno != EAGAIN && errno != EINPROGRESS) return (13);
|
||||||
|
}
|
||||||
|
memset(fds, 0, sizeof(fds));
|
||||||
|
fds[0].fd = sock;
|
||||||
|
fds[0].events = POLLOUT;
|
||||||
|
if(so._poll(fds, 1, conf.timeouts[STRING_S]*1000) <= 0) {
|
||||||
|
return (13);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int doconnect(struct clientparam * param){
|
int doconnect(struct clientparam * param){
|
||||||
SASIZETYPE size;
|
SASIZETYPE size;
|
||||||
|
|
||||||
@ -702,21 +723,8 @@ int doconnect(struct clientparam * param){
|
|||||||
}
|
}
|
||||||
|
|
||||||
if(param->operation >= 256 || (param->operation & CONNECT)){
|
if(param->operation >= 256 || (param->operation & CONNECT)){
|
||||||
struct pollfd fds[1];
|
if(connectwithpoll(param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr))) {
|
||||||
#ifdef _WIN32
|
return 13;
|
||||||
unsigned long ul = 1;
|
|
||||||
ioctlsocket(param->remsock, FIONBIO, &ul);
|
|
||||||
#else
|
|
||||||
fcntl(param->remsock,F_SETFL,O_NONBLOCK);
|
|
||||||
#endif
|
|
||||||
if(so._connect(param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr))) {
|
|
||||||
if(errno != EAGAIN && errno != EINPROGRESS) return (13);
|
|
||||||
}
|
|
||||||
memset(fds, 0, sizeof(fds));
|
|
||||||
fds[0].fd = param->remsock;
|
|
||||||
fds[0].events = POLLOUT;
|
|
||||||
if(so._poll(fds, 1, conf.timeouts[STRING_S]*1000) <= 0) {
|
|
||||||
return (13);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
size = sizeof(param->sinsl);
|
size = sizeof(param->sinsl);
|
||||||
|
@ -140,7 +140,7 @@ void * dnsprchild(struct clientparam* param) {
|
|||||||
}
|
}
|
||||||
param->sinsr = nservers[0].addr;
|
param->sinsr = nservers[0].addr;
|
||||||
if(nservers[0].usetcp) {
|
if(nservers[0].usetcp) {
|
||||||
if(so._connect(param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr))) RETURN(830);
|
if(connectwithpoll(param->remsock,(struct sockaddr *)¶m->sinsr,SASIZE(¶m->sinsr))) RETURN(830);
|
||||||
buf-=2;
|
buf-=2;
|
||||||
*(unsigned short*)buf = htons(i);
|
*(unsigned short*)buf = htons(i);
|
||||||
i+=2;
|
i+=2;
|
||||||
|
@ -145,7 +145,7 @@ void * ftpprchild(struct clientparam* param) {
|
|||||||
|
|
||||||
if(sscanf((char *)buf+5, "%lu,%lu,%lu,%lu,%hu,%hu", &b1, &b2, &b3, &b4, &b5, &b6)!=6) {RETURN(828);}
|
if(sscanf((char *)buf+5, "%lu,%lu,%lu,%lu,%hu,%hu", &b1, &b2, &b3, &b4, &b5, &b6)!=6) {RETURN(828);}
|
||||||
*SAPORT(¶m->sincr) = htons((unsigned short)((b5<<8)^b6));
|
*SAPORT(¶m->sincr) = htons((unsigned short)((b5<<8)^b6));
|
||||||
if(so._connect(clidatasock, (struct sockaddr *)¶m->sincr, SASIZE(¶m->sincr))) {
|
if(connectwithpoll(clidatasock, (struct sockaddr *)¶m->sincr, SASIZE(¶m->sincr))) {
|
||||||
so._closesocket(clidatasock);
|
so._closesocket(clidatasock);
|
||||||
clidatasock = INVALID_SOCKET;
|
clidatasock = INVALID_SOCKET;
|
||||||
RETURN(826);
|
RETURN(826);
|
||||||
|
@ -270,6 +270,7 @@ void srvinit2(struct srvparam * srv, struct clientparam *param);
|
|||||||
void srvfree(struct srvparam * srv);
|
void srvfree(struct srvparam * srv);
|
||||||
unsigned char * dologname (unsigned char *buf, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t);
|
unsigned char * dologname (unsigned char *buf, unsigned char *name, const unsigned char *ext, ROTATION lt, time_t t);
|
||||||
int readconfig(FILE * fp);
|
int readconfig(FILE * fp);
|
||||||
|
int connectwithpoll(SOCKET sock, struct sockaddr *sa, SASIZETYPE size);
|
||||||
|
|
||||||
|
|
||||||
int myrand(void * entropy, int len);
|
int myrand(void * entropy, int len);
|
||||||
|
@ -553,7 +553,7 @@ int MODULEMAINFUNC (int argc, char** argv){
|
|||||||
new_sock=so._socket(SASOCK(&defparam.sincr), SOCK_STREAM, IPPROTO_TCP);
|
new_sock=so._socket(SASOCK(&defparam.sincr), SOCK_STREAM, IPPROTO_TCP);
|
||||||
if(new_sock != INVALID_SOCKET){
|
if(new_sock != INVALID_SOCKET){
|
||||||
parsehost(srv.family, cbc_string, (struct sockaddr *)&defparam.sincr);
|
parsehost(srv.family, cbc_string, (struct sockaddr *)&defparam.sincr);
|
||||||
if(so._connect(new_sock,(struct sockaddr *)&defparam.sincr,SASIZE(&defparam.sincr))) {
|
if(connectwithpoll(new_sock,(struct sockaddr *)&defparam.sincr,SASIZE(&defparam.sincr))) {
|
||||||
so._closesocket(new_sock);
|
so._closesocket(new_sock);
|
||||||
new_sock = INVALID_SOCKET;
|
new_sock = INVALID_SOCKET;
|
||||||
usleep(SLEEPTIME);
|
usleep(SLEEPTIME);
|
||||||
|
Loading…
Reference in New Issue
Block a user