Added support for blocking on multiple sockets simultaneously

This commit is contained in:
Fred Nicolson
2016-12-09 23:52:16 +00:00
parent 9cbe2aa8e8
commit b581418f2e
8 changed files with 171 additions and 33 deletions
+53
View File
@@ -0,0 +1,53 @@
//
// Created by fred on 09/12/16.
//
#include "SocketSelector.h"
namespace fr
{
SocketSelector::SocketSelector() noexcept
{
//Zero out sets
FD_ZERO(&listen_set);
FD_ZERO(&listen_read);
max_descriptor = 0;
}
void SocketSelector::add(const Socket &socket)
{
//Add it to the set
FD_SET(socket.get_socket_descriptor(), &listen_set);
if(socket.get_socket_descriptor() > max_descriptor)
max_descriptor = socket.get_socket_descriptor();
}
bool SocketSelector::wait()
{
listen_read = listen_set;
if(select(max_descriptor + 1, &listen_read, NULL, NULL, NULL) == SOCKET_ERROR)
{
//Check that we've not just timed out
if(errno == EAGAIN || errno == EWOULDBLOCK)
return true;
//Oops
throw std::logic_error("select() returned -1");
}
return true;
}
void SocketSelector::remove(const Socket &socket)
{
FD_CLR(socket.get_socket_descriptor(), &listen_set);
}
bool SocketSelector::is_ready(const Socket &socket)
{
return (FD_ISSET(socket.get_socket_descriptor(), &listen_read));
}
}