Browse Source

Set linger timeout as configuration value

bel 8 years ago
parent
commit
b5a34cf727
1 changed files with 18 additions and 12 deletions
  1. 18 12
      src/civetweb.c

+ 18 - 12
src/civetweb.c

@@ -12365,18 +12365,24 @@ close_socket_gracefully(struct mg_connection *conn)
 		linger_timeout = atoi(conn->ctx->config[LINGER_TIMEOUT]);
 	}
 
-	/* Set linger option to avoid socket hanging out after close. This
-	 * prevent ephemeral port exhaust problem under high QPS. */
-	linger.l_onoff = (linger_timeout >= 0);
-	linger.l_linger = (linger_timeout + 999) / 1000;
+	/* Set linger option according to configuration */
+	if (linger_timeout >= 0) {
+		/* Set linger option to avoid socket hanging out after close. This
+		 * prevent ephemeral port exhaust problem under high QPS. */
+		linger.l_onoff = 1;
+		linger.l_linger = (linger_timeout + 999) / 1000;
+	} else {
+		linger.l_onoff = 0;
+		linger.l_linger = 0;
+	}
 
 	if (linger_timeout < -1) {
-        /* Default: don't configure any linger */
-    } else if (getsockopt(conn->client.sock,
-	               SOL_SOCKET,
-	               SO_ERROR,
-	               (char *)&error_code,
-	               &opt_len) != 0) {
+		/* Default: don't configure any linger */
+	} else if (getsockopt(conn->client.sock,
+	                      SOL_SOCKET,
+	                      SO_ERROR,
+	                      (char *)&error_code,
+	                      &opt_len) != 0) {
 		/* Cannot determine if socket is already closed. This should
 		 * not occur and never did in a test. Log an error message
 		 * and continue. */
@@ -12397,8 +12403,8 @@ close_socket_gracefully(struct mg_connection *conn)
 			mg_cry(conn,
 			       "%s: setsockopt(SOL_SOCKET SO_LINGER(%i,%i)) failed: %s",
 			       __func__,
-                   linger.l_onoff,
-                   linger.l_linger,
+			       linger.l_onoff,
+			       linger.l_linger,
 			       strerror(ERRNO));
 		}
 	}