浏览代码

Merge pull request #355 from saumitravikram/master

close socket without linger when connection already closed from client (see #237)
bel2125 8 年之前
父节点
当前提交
0abb4a21c6
共有 1 个文件被更改,包括 16 次插入10 次删除
  1. 16 10
      src/civetweb.c

+ 16 - 10
src/civetweb.c

@@ -11915,16 +11915,22 @@ close_socket_gracefully(struct mg_connection *conn)
 	 * ephemeral port exhaust problem under high QPS. */
 	linger.l_onoff = 1;
 	linger.l_linger = 1;
-
-	if (setsockopt(conn->client.sock,
-	               SOL_SOCKET,
-	               SO_LINGER,
-	               (char *)&linger,
-	               sizeof(linger)) != 0) {
-		mg_cry(conn,
-		       "%s: setsockopt(SOL_SOCKET SO_LINGER) failed: %s",
-		       __func__,
-		       strerror(ERRNO));
+	socklen_t error_code=0;
+	getsockopt(conn->client.sock, SOL_SOCKET, SO_ERROR, &error_code, (socklen_t *)sizeof(error_code));
+	if (error_code==ECONNRESET) {
+		/* Socket already closed by client/peer, close socket without linger */
+	}
+	else{
+		if (setsockopt(conn->client.sock,
+					   SOL_SOCKET,
+					   SO_LINGER,
+					   (char *)&linger,
+					   sizeof(linger)) != 0) {
+			mg_cry(conn,
+				   "%s: setsockopt(SOL_SOCKET SO_LINGER) failed: %s",
+				   __func__,
+				   strerror(ERRNO));
+		}
 	}
 
 	/* Send FIN to the client */