diff --git a/mongoose.c b/mongoose.c index c3278b6b..870791fb 100644 --- a/mongoose.c +++ b/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);