53 lines
1.2 KiB
C++
53 lines
1.2 KiB
C++
//
|
|
// 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));
|
|
}
|
|
} |