diff --git a/components/net/cpp/include/ftl/net/peer.hpp b/components/net/cpp/include/ftl/net/peer.hpp index 0535fc22d2fcac5ef558605e67aedc00cf26787c..e1ef7b5d59c89c1b7f78239c185d1effbcee1fbe 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 57fdab3a9540f01ee32bdb0ebc016dd6ffb5e53d..8e3e73151f80bb3bee610f0beb99aa11757cb596 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 809bba4af8f1ec7becf35f93904b2d52e5ac14e8..d72efceba5f7f7edd53167073aab47dba4a62a34 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_)) {