Browse Source

api.c in linux allow to open a closed socket in TIME_WAIT

nfactor-troky
Kano 12 years ago
parent
commit
ede0dd6a52
  1. 14
      api.c

14
api.c

@ -3197,6 +3197,20 @@ void api(int api_thr_id)
serv.sin_port = htons(port); serv.sin_port = htons(port);
#ifndef WIN32
// On linux with SO_REUSEADDR, bind will get the port if the previous
// socket is closed (even if it is still in TIME_WAIT) but fail if
// another program has it open - which is what we want
int optval = 1;
// If it doesn't work, we don't really care - just show a debug message
if (SOCKETFAIL(setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void *)(&optval), sizeof(optval))))
applog(LOG_DEBUG, "API setsockopt SO_REUSEADDR failed (ignored): %s", SOCKERRMSG);
#else
// On windows a 2nd program can bind to a port>1024 already in use unless
// SO_EXCLUSIVEADDRUSE is used - however then the bind to a closed port
// in TIME_WAIT will fail until the timeout - so we leave the options alone
#endif
// try for more than 1 minute ... in case the old one hasn't completely gone yet // try for more than 1 minute ... in case the old one hasn't completely gone yet
bound = 0; bound = 0;
bindstart = time(NULL); bindstart = time(NULL);

Loading…
Cancel
Save