net: convert standalone SetSocketNonBlocking() to Sock::SetNonBlocking()

This further encapsulates syscalls inside the `Sock` class.

Co-authored-by: practicalswift <practicalswift@users.noreply.github.com>
This commit is contained in:
Vasil Dimov
2021-04-19 11:35:09 +02:00
parent 29f66f7682
commit b527b54950
6 changed files with 37 additions and 14 deletions

View File

@@ -117,18 +117,22 @@ int Sock::GetSockName(sockaddr* name, socklen_t* name_len) const
return getsockname(m_socket, name, name_len);
}
bool SetSocketNonBlocking(const SOCKET& hSocket)
bool Sock::SetNonBlocking() const
{
#ifdef WIN32
u_long nOne = 1;
if (ioctlsocket(hSocket, FIONBIO, &nOne) == SOCKET_ERROR) {
#else
int fFlags = fcntl(hSocket, F_GETFL, 0);
if (fcntl(hSocket, F_SETFL, fFlags | O_NONBLOCK) == SOCKET_ERROR) {
#endif
u_long on{1};
if (ioctlsocket(m_socket, FIONBIO, &on) == SOCKET_ERROR) {
return false;
}
#else
const int flags{fcntl(m_socket, F_GETFL, 0)};
if (flags == SOCKET_ERROR) {
return false;
}
if (fcntl(m_socket, F_SETFL, flags | O_NONBLOCK) == SOCKET_ERROR) {
return false;
}
#endif
return true;
}

View File

@@ -133,6 +133,12 @@ public:
*/
[[nodiscard]] virtual int GetSockName(sockaddr* name, socklen_t* name_len) const;
/**
* Set the non-blocking option on the socket.
* @return true if set successfully
*/
[[nodiscard]] virtual bool SetNonBlocking() const;
/**
* Check if the underlying socket can be used for `select(2)` (or the `Wait()` method).
* @return true if selectable
@@ -273,9 +279,6 @@ private:
void Close();
};
/** Enable non-blocking mode for a socket */
bool SetSocketNonBlocking(const SOCKET& hSocket);
/** Return readable error string for a network error code */
std::string NetworkErrorString(int err);