0
0
Fork 0
mirror of https://github.com/bitcoin/bitcoin.git synced 2025-02-08 10:31:50 -05:00

net: extend Sock with a method to check whether connected

This will be convenient in the I2P SAM implementation.
This commit is contained in:
Vasil Dimov 2021-01-21 16:59:55 +01:00
parent 42c779f503
commit 5bac7e45e1
No known key found for this signature in database
GPG key ID: 54DF06F64B55CBBF
2 changed files with 32 additions and 0 deletions

View file

@ -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)
{

View file

@ -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.