|
@@ -890,6 +890,25 @@ check_location_for_unix_socket(or_options_t *options, const char *path)
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
+/** Tell the TCP stack that it shouldn't wait for a long time after
|
|
|
+ * <b>sock</b> has closed before reusing its port. */
|
|
|
+static void
|
|
|
+make_socket_reuseable(int sock)
|
|
|
+{
|
|
|
+#ifdef MS_WINDOWS
|
|
|
+ (void) sock;
|
|
|
+#else
|
|
|
+ int one=1;
|
|
|
+
|
|
|
+ /* REUSEADDR on normal places means you can rebind to the port
|
|
|
+ * right after somebody else has let it go. But REUSEADDR on win32
|
|
|
+ * means you can bind to the port _even when somebody else
|
|
|
+ * already has it bound_. So, don't do that on Win32. */
|
|
|
+ setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (void*) &one,
|
|
|
+ (socklen_t)sizeof(one));
|
|
|
+#endif
|
|
|
+}
|
|
|
+
|
|
|
/** Bind a new non-blocking socket listening to the socket described
|
|
|
* by <b>listensockaddr</b>.
|
|
|
*
|
|
@@ -914,9 +933,6 @@ connection_create_listener(const struct sockaddr *listensockaddr,
|
|
|
if (listensockaddr->sa_family == AF_INET) {
|
|
|
tor_addr_t addr;
|
|
|
int is_tcp = (type != CONN_TYPE_AP_DNS_LISTENER);
|
|
|
-#ifndef MS_WINDOWS
|
|
|
- int one=1;
|
|
|
-#endif
|
|
|
if (is_tcp)
|
|
|
start_reading = 1;
|
|
|
|
|
@@ -933,14 +949,7 @@ connection_create_listener(const struct sockaddr *listensockaddr,
|
|
|
goto err;
|
|
|
}
|
|
|
|
|
|
-#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 you can 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,
|
|
|
- (socklen_t)sizeof(one));
|
|
|
-#endif
|
|
|
+ make_socket_reuseable(s);
|
|
|
|
|
|
if (bind(s,listensockaddr,socklen) < 0) {
|
|
|
const char *helpfulhint = "";
|
|
@@ -1159,6 +1168,7 @@ connection_handle_listener_read(connection_t *conn, int new_type)
|
|
|
"Connection accepted on socket %d (child of fd %d).",
|
|
|
news,conn->s);
|
|
|
|
|
|
+ make_socket_reuseable(news);
|
|
|
set_socket_nonblocking(news);
|
|
|
|
|
|
if (options->ConstrainedSockets)
|
|
@@ -1368,6 +1378,8 @@ connection_connect(connection_t *conn, const char *address,
|
|
|
log_debug(LD_NET, "Connecting to %s:%u.",
|
|
|
escaped_safe_str_client(address), port);
|
|
|
|
|
|
+ make_socket_reuseable(s);
|
|
|
+
|
|
|
if (connect(s, dest_addr, dest_addr_len) < 0) {
|
|
|
int e = tor_socket_errno(s);
|
|
|
if (!ERRNO_IS_CONN_EINPROGRESS(e)) {
|