From 5bac7e45e1d3a07115b5ff002d988438fcc92a53 Mon Sep 17 00:00:00 2001 From: Vasil Dimov Date: Thu, 21 Jan 2021 16:59:55 +0100 Subject: [PATCH] net: extend Sock with a method to check whether connected This will be convenient in the I2P SAM implementation. --- src/util/sock.cpp | 25 +++++++++++++++++++++++++ src/util/sock.h | 7 +++++++ 2 files changed, 32 insertions(+) diff --git a/src/util/sock.cpp b/src/util/sock.cpp index 36493ec241..e13c52a16a 100644 --- a/src/util/sock.cpp +++ b/src/util/sock.cpp @@ -250,6 +250,31 @@ std::string Sock::RecvUntilTerminator(uint8_t terminator, } } +bool Sock::IsConnected(std::string& errmsg) const +{ + if (m_socket == INVALID_SOCKET) { + errmsg = "not connected"; + return false; + } + + char c; + switch (Recv(&c, sizeof(c), MSG_PEEK)) { + case -1: { + const int err = WSAGetLastError(); + if (IOErrorIsPermanent(err)) { + errmsg = NetworkErrorString(err); + return false; + } + return true; + } + case 0: + errmsg = "closed"; + return false; + default: + return true; + } +} + #ifdef WIN32 std::string NetworkErrorString(int err) { diff --git a/src/util/sock.h b/src/util/sock.h index 209d30def4..ecebb84205 100644 --- a/src/util/sock.h +++ b/src/util/sock.h @@ -143,6 +143,13 @@ public: std::chrono::milliseconds timeout, CThreadInterrupt& interrupt) const; + /** + * Check if still connected. + * @param[out] err The error string, if the socket has been disconnected. + * @return true if connected + */ + virtual bool IsConnected(std::string& errmsg) const; + private: /** * Contained socket. `INVALID_SOCKET` designates the object is empty.