79 lines
2.1 KiB
C
79 lines
2.1 KiB
C
#ifndef __SOCKET_SELECTOR_H__
|
|
#define __SOCKET_SELECTOR_H__
|
|
|
|
// This is a structure on purpose. only used as a helper class to save on
|
|
// typing
|
|
struct Socket_Selector
|
|
{
|
|
Socket_fdset _read;
|
|
Socket_fdset _write;
|
|
Socket_fdset _error;
|
|
int _answer;
|
|
|
|
Socket_Selector() : _answer( -1)
|
|
{
|
|
}
|
|
|
|
Socket_Selector(const Socket_fdset &fd) : _read(fd), _write(fd), _error(fd) , _answer( -1)
|
|
{
|
|
}
|
|
|
|
int WaitFor(const Time_Span &timeout);
|
|
int WaitFor_All(const Socket_fdset & fd, const Time_Span & timeout);
|
|
int WaitFor_Read_Error(const Socket_fdset & fd, const Time_Span & timeout);
|
|
int WaitFor_Write_Error(const Socket_fdset & fd, const Time_Span & timeout);
|
|
};
|
|
|
|
/**
|
|
* This function is the reason this call exists.. It will wait for a read,
|
|
* write or error condition on a socket or it will time out
|
|
*/
|
|
inline int Socket_Selector::WaitFor(const Time_Span &timeout)
|
|
{
|
|
SOCKET local_max = 0;
|
|
if (local_max < _read._maxid)
|
|
local_max = _read._maxid;
|
|
if (local_max < _write._maxid)
|
|
local_max = _write._maxid;
|
|
if (local_max < _error._maxid)
|
|
local_max = _error._maxid;
|
|
|
|
timeval localtv = timeout.GetTval();
|
|
_answer = DO_SELECT(local_max + 1, &_read._the_set, &_write._the_set, &_error._the_set, &localtv);
|
|
return _answer;
|
|
}
|
|
|
|
/**
|
|
* Helper function to utilize the WaitFor function
|
|
*/
|
|
inline int Socket_Selector::WaitFor_All(const Socket_fdset & fd, const Time_Span & timeout)
|
|
{
|
|
_read = fd;
|
|
_write = fd;
|
|
_error = fd;
|
|
return WaitFor(timeout);
|
|
}
|
|
|
|
/**
|
|
* Helper function for WaitFor Only looks for readability and errors
|
|
*/
|
|
inline int Socket_Selector::WaitFor_Read_Error(const Socket_fdset & fd, const Time_Span & timeout)
|
|
{
|
|
_read = fd;
|
|
_write.clear();
|
|
_error = fd;
|
|
return WaitFor(timeout);
|
|
}
|
|
|
|
/**
|
|
* Helper function for WaitFor Only looks for writability and errors
|
|
*/
|
|
inline int Socket_Selector::WaitFor_Write_Error(const Socket_fdset & fd, const Time_Span & timeout)
|
|
{
|
|
_read.clear();
|
|
_write = fd;
|
|
_error = fd;
|
|
return WaitFor(timeout);
|
|
}
|
|
|
|
#endif //__SOCKET_SELECTOR_H__
|