From f69b52b1aa5b196da5104c5dfac81e2de1eb5e53 Mon Sep 17 00:00:00 2001 From: Tatsuhiro Tsujikawa Date: Sat, 18 Mar 2017 00:59:26 +0900 Subject: [PATCH] nghttpx: Attempt to avoid TCP RST on socket closure on Linux --- src/shrpx_connection.cc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/shrpx_connection.cc b/src/shrpx_connection.cc index a19757a1..a4d4c598 100644 --- a/src/shrpx_connection.cc +++ b/src/shrpx_connection.cc @@ -126,7 +126,20 @@ void Connection::disconnect() { } if (fd != -1) { - shutdown(fd, SHUT_WR); + // At least for Linux, shutdown both sides, and continue to read + // until it gets EOF or error in order to avoid TCP RST. + shutdown(fd, SHUT_RDWR); +#ifdef __linux__ + std::array b; + for (;;) { + ssize_t n; + while ((n = read(fd, b.data(), b.size())) == -1 && errno == EINTR) + ; + if (n <= 0) { + break; + } + } +#endif // __linux__ close(fd); fd = -1; }