Loading src/event/epoll.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -1125,14 +1125,17 @@ namespace netplus { bool socketwait::isDisconnected(socket &sock) { SOCKET fd = sock.fd(); if (fd < 0) return true; struct epoll_event ev{}; ev.events = EPOLLIN; // A peer FIN normally reports EPOLLIN (readable EOF), not EPOLLHUP. // Ask for RDHUP explicitly so a pooled client reconnects before reuse. ev.events = EPOLLIN | EPOLLRDHUP; ev.data.fd = fd; epoll_ctl(_handle, EPOLL_CTL_ADD, fd, &ev); struct epoll_event out; if (epoll_ctl(_handle, EPOLL_CTL_ADD, fd, &ev) < 0) return true; struct epoll_event out{}; int r = ::epoll_wait(_handle, &out, 1, 0); epoll_ctl(_handle, EPOLL_CTL_DEL, fd, nullptr); return r > 0 && (out.events & (EPOLLHUP | EPOLLERR)); return r < 0 || (r > 0 && (out.events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR))); } std::shared_ptr<con> lookupConnection(int fd) { Loading Loading
src/event/epoll.cpp +7 −4 Original line number Diff line number Diff line Loading @@ -1125,14 +1125,17 @@ namespace netplus { bool socketwait::isDisconnected(socket &sock) { SOCKET fd = sock.fd(); if (fd < 0) return true; struct epoll_event ev{}; ev.events = EPOLLIN; // A peer FIN normally reports EPOLLIN (readable EOF), not EPOLLHUP. // Ask for RDHUP explicitly so a pooled client reconnects before reuse. ev.events = EPOLLIN | EPOLLRDHUP; ev.data.fd = fd; epoll_ctl(_handle, EPOLL_CTL_ADD, fd, &ev); struct epoll_event out; if (epoll_ctl(_handle, EPOLL_CTL_ADD, fd, &ev) < 0) return true; struct epoll_event out{}; int r = ::epoll_wait(_handle, &out, 1, 0); epoll_ctl(_handle, EPOLL_CTL_DEL, fd, nullptr); return r > 0 && (out.events & (EPOLLHUP | EPOLLERR)); return r < 0 || (r > 0 && (out.events & (EPOLLRDHUP | EPOLLHUP | EPOLLERR))); } std::shared_ptr<con> lookupConnection(int fd) { Loading