net: extend Sock with a method to check whether connected

This will be convenient in the I2P SAM implementation.
pull/826/head
Vasil Dimov 4 years ago
parent 42c779f503
commit 5bac7e45e1
No known key found for this signature in database
GPG Key ID: 54DF06F64B55CBBF

@ -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…
Cancel
Save