Commit bd37c9a3 authored by Roger Dingledine's avatar Roger Dingledine
Browse files

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
parent 4abb54a8
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -401,7 +401,9 @@ static int connection_create_listener(const char *bindaddress, uint16_t bindport
  uint16_t usePort;
  uint32_t addr;
  int s; /* the socket we're going to make */
#ifndef MS_WINDOWS
  int one=1;
#endif

  memset(&bindaddr,0,sizeof(struct sockaddr_in));
  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;
  }

#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));
#endif

  if (bind(s,(struct sockaddr *)&bindaddr,sizeof(bindaddr)) < 0) {
    log_fn(LOG_WARN,"Could not bind to port %u: %s",usePort,