|
@@ -3353,12 +3353,13 @@ static int set_ports_option(struct mg_context *ctx) {
|
|
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on,
|
|
setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on,
|
|
sizeof(on)) != 0 ||
|
|
sizeof(on)) != 0 ||
|
|
#endif // !_WIN32
|
|
#endif // !_WIN32
|
|
- // Set TCP keep-alive. This needed because if HTTP-level
|
|
|
|
|
|
+ // Set TCP keep-alive. This is needed because if HTTP-level
|
|
// keep-alive is enabled, and client resets the connection,
|
|
// keep-alive is enabled, and client resets the connection,
|
|
// server won't get TCP FIN or RST and will keep the connection
|
|
// server won't get TCP FIN or RST and will keep the connection
|
|
// open forever. With TCP keep-alive, next keep-alive
|
|
// open forever. With TCP keep-alive, next keep-alive
|
|
// handshake will figure out that the client is down and
|
|
// handshake will figure out that the client is down and
|
|
// will close the server end.
|
|
// will close the server end.
|
|
|
|
+ // Thanks to Igor Klopov who suggested the patch.
|
|
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &on,
|
|
setsockopt(sock, SOL_SOCKET, SO_KEEPALIVE, &on,
|
|
sizeof(on)) != 0 ||
|
|
sizeof(on)) != 0 ||
|
|
bind(sock, &so.lsa.u.sa, so.lsa.len) != 0 ||
|
|
bind(sock, &so.lsa.u.sa, so.lsa.len) != 0 ||
|