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:
parent
42c779f503
commit
5bac7e45e1
2 changed files with 32 additions and 0 deletions
|
@ -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)
|
||||
{
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Reference in a new issue