REUSEADDR on normal places means you can rebind to the port

right after somebody else has let it go. But REUSEADDR on win32
means to let you bind to the port _even when somebody else
already has it bound_. So, don't do that on Win32.


svn:r3867
This commit is contained in:
Roger Dingledine 2005-03-24 23:20:06 +00:00
parent 4abb54a876
commit bd37c9a3bd

View File

@ -401,7 +401,9 @@ static int connection_create_listener(const char *bindaddress, uint16_t bindport
uint16_t usePort; uint16_t usePort;
uint32_t addr; uint32_t addr;
int s; /* the socket we're going to make */ int s; /* the socket we're going to make */
#ifndef MS_WINDOWS
int one=1; int one=1;
#endif
memset(&bindaddr,0,sizeof(struct sockaddr_in)); memset(&bindaddr,0,sizeof(struct sockaddr_in));
if (parse_addr_port(bindaddress, NULL, &addr, &usePort)<0) { if (parse_addr_port(bindaddress, NULL, &addr, &usePort)<0) {
@ -425,7 +427,13 @@ static int connection_create_listener(const char *bindaddress, uint16_t bindport
return -1; return -1;
} }
#ifndef MS_WINDOWS
/* REUSEADDR on normal places means you can rebind to the port
* right after somebody else has let it go. But REUSEADDR on win32
* means to let you bind to the port _even when somebody else
* already has it bound_. So, don't do that on Win32. */
setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void*) &one, sizeof(one)); setsockopt(s, SOL_SOCKET, SO_REUSEADDR, (void*) &one, sizeof(one));
#endif
if (bind(s,(struct sockaddr *)&bindaddr,sizeof(bindaddr)) < 0) { if (bind(s,(struct sockaddr *)&bindaddr,sizeof(bindaddr)) < 0) {
log_fn(LOG_WARN,"Could not bind to port %u: %s",usePort, log_fn(LOG_WARN,"Could not bind to port %u: %s",usePort,