소스 검색

Set keep alive on TCP level

valenok 14 년 전
부모
커밋
abc230eb34
1개의 변경된 파일11개의 추가작업 그리고 3개의 파일을 삭제
  1. 11 3
      mongoose.c

+ 11 - 3
mongoose.c

@@ -3333,7 +3333,7 @@ static int parse_port_string(const struct vec *vec, struct socket *so) {
 
 static int set_ports_option(struct mg_context *ctx) {
   const char *list = ctx->config[LISTENING_PORTS];
-  int reuseaddr = 1, success = 1;
+  int on = 1, success = 1;
   SOCKET sock;
   struct vec vec;
   struct socket so, *listener;
@@ -3350,9 +3350,17 @@ static int set_ports_option(struct mg_context *ctx) {
 #if !defined(_WIN32)
                // On Windows, SO_REUSEADDR is recommended only for
                // broadcast UDP sockets
-               setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &reuseaddr,
-                          sizeof(reuseaddr)) != 0 ||
+               setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on,
+                          sizeof(on)) != 0 ||
 #endif // !_WIN32
+               // Set TCP keep-alive. This needed because if HTTP-level
+               // keep-alive is enabled, and client resets the connection,
+               // server won't get TCP FIN or RST and will keep the connection
+               // open forever. With TCP keep-alive, next keep-alive
+               // handshake will figure out that the client is down and
+               // will close the server end.
+               setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &on,
+                          sizeof(on)) != 0 ||
                bind(sock, &so.lsa.u.sa, so.lsa.len) != 0 ||
                listen(sock, 20) != 0) {
       closesocket(sock);