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