diff --git a/src/common.c b/src/common.c index bcaa637..a70c2c8 100644 --- a/src/common.c +++ b/src/common.c @@ -630,7 +630,8 @@ int doconnect(struct clientparam * param){ if(so._getpeername(param->remsock, (struct sockaddr *)¶m->sinsr, &size)==-1) {return (15);} } else { - struct linger lg; + struct linger lg = {1,conf.timeouts[SINGLEBYTE_S]}; + int opt = 1; if(SAISNULL(¶m->sinsr)){ if(SAISNULL(¶m->req)) { @@ -642,6 +643,8 @@ int doconnect(struct clientparam * param){ if(!*SAPORT(¶m->sinsr))*SAPORT(¶m->sinsr) = *SAPORT(¶m->req); if ((param->remsock=so._socket(SASOCK(¶m->sinsr), SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET) {return (11);} so._setsockopt(param->remsock, SOL_SOCKET, SO_LINGER, (unsigned char *)&lg, sizeof(lg)); + so._setsockopt(param->remsock, SOL_SOCKET, SO_REUSEADDR, (unsigned char *)&opt, sizeof(int)); + #ifndef NOIPV6 if(*SAFAMILY(¶m->sinsr) == AF_INET6) memcpy(¶m->sinsl, ¶m->srv->extsa6, sizeof(param->srv->extsa6)); else @@ -649,13 +652,7 @@ int doconnect(struct clientparam * param){ memcpy(¶m->sinsl, ¶m->srv->extsa, sizeof(param->srv->extsa)); if (param->srv->targetport && !*SAPORT(¶m->sinsl) && ntohs(*SAPORT(¶m->sincr)) > 1023) *SAPORT(¶m->sinsl) = *SAPORT(¶m->sincr); if(so._bind(param->remsock, (struct sockaddr*)¶m->sinsl, sizeof(param->sinsl))==-1) { -#ifndef NOIPV6 - if(*SAFAMILY(¶m->sinsr) == AF_INET) -#endif - memcpy(¶m->sinsl, ¶m->srv->extsa, sizeof(param->srv->extsa)); -#ifndef NOIPV6 - else memcpy(¶m->sinsl, ¶m->srv->extsa6, sizeof(param->srv->extsa6)); -#endif + *SAPORT(¶m->sinsl) = 0; if(so._bind(param->remsock, (struct sockaddr*)¶m->sinsl, sizeof(param->sinsl))==-1) { return 12; }