From 760b29872c29c3c04d40d2adf441f9947df91343 Mon Sep 17 00:00:00 2001 From: Nicolas Pope <nwpope@utu.fi> Date: Thu, 27 Aug 2020 13:54:49 +0300 Subject: [PATCH] Dont close socket on non errors --- components/net/cpp/include/ftl/net/peer.hpp | 2 +- components/net/cpp/src/peer.cpp | 7 +++++-- components/net/cpp/src/universe.cpp | 7 ++++--- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/components/net/cpp/include/ftl/net/peer.hpp b/components/net/cpp/include/ftl/net/peer.hpp index 0535fc22d..e1ef7b5d5 100644 --- a/components/net/cpp/include/ftl/net/peer.hpp +++ b/components/net/cpp/include/ftl/net/peer.hpp @@ -205,7 +205,7 @@ class Peer { protected: void data(); // Process one message from socket - void socketError(); // Process one error from socket + bool socketError(); // Process one error from socket void error(int e); bool _data(); diff --git a/components/net/cpp/src/peer.cpp b/components/net/cpp/src/peer.cpp index 57fdab3a9..8e3e73151 100644 --- a/components/net/cpp/src/peer.cpp +++ b/components/net/cpp/src/peer.cpp @@ -401,7 +401,7 @@ void Peer::_badClose(bool retry) { } } -void Peer::socketError() { +bool Peer::socketError() { int err; #ifdef WIN32 int optlen = sizeof(err); @@ -410,11 +410,14 @@ void Peer::socketError() { #endif getsockopt(sock_, SOL_SOCKET, SO_ERROR, (char*)&err, &optlen); + if (err == 0) return false; + // Must close before log since log may try to send over net causing // more socket errors... _badClose(); - if (err != 0) LOG(ERROR) << "Socket: " << uri_ << " - error " << err; + LOG(ERROR) << "Socket: " << uri_ << " - error " << err; + return true; } void Peer::error(int e) { diff --git a/components/net/cpp/src/universe.cpp b/components/net/cpp/src/universe.cpp index 809bba4af..d72efceba 100644 --- a/components/net/cpp/src/universe.cpp +++ b/components/net/cpp/src/universe.cpp @@ -445,9 +445,10 @@ void Universe::_run() { if (sock == INVALID_SOCKET) continue; if (FD_ISSET(sock, &impl_->sfderror_)) { - s->socketError(); - s->close(); - continue; // No point in reading data... + if (s->socketError()) { + s->close(); + continue; // No point in reading data... + } } //If message received from this client then deal with it if (FD_ISSET(sock, &impl_->sfdread_)) { -- GitLab