nghttpx: Attempt to avoid TCP RST on socket closure on Linux

This commit is contained in:
Tatsuhiro Tsujikawa 2017-03-18 00:59:26 +09:00
parent 1e1d908c12
commit f69b52b1aa
1 changed files with 14 additions and 1 deletions

View File

@ -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<uint8_t, 16_k> 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;
}