Classes | Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
FIX::SocketMonitor Class Reference

Monitors events on a collection of sockets. More...

#include <SocketMonitor.h>

Classes

class  Strategy
 

Public Member Functions

 SocketMonitor (int timeout=0)
 
virtual ~SocketMonitor ()
 
bool addConnect (int socket)
 
bool addRead (int socket)
 
bool addWrite (int socket)
 
bool drop (int socket)
 
void signal (int socket)
 
void unsignal (int socket)
 
void block (Strategy &strategy, bool poll=0, double timeout=0.0)
 
size_t numSockets ()
 

Private Types

typedef std::set< int > Sockets
 
typedef std::queue< int > Queue
 

Private Member Functions

void setsockopt ()
 
bool bind ()
 
bool listen ()
 
void buildSet (const Sockets &, fd_set &)
 
timeval * getTimeval (bool poll, double timeout)
 
bool sleepIfEmpty (bool poll)
 
void processReadSet (Strategy &, fd_set &)
 
void processWriteSet (Strategy &, fd_set &)
 
void processExceptSet (Strategy &, fd_set &)
 

Private Attributes

int m_timeout
 
timeval m_timeval
 
clock_t m_ticks
 
int m_signal
 
int m_interrupt
 
Sockets m_connectSockets
 
Sockets m_readSockets
 
Sockets m_writeSockets
 
Queue m_dropped
 

Detailed Description

Monitors events on a collection of sockets.

Definition at line 64 of file SocketMonitor.h.

Member Typedef Documentation

◆ Queue

typedef std::queue< int > FIX::SocketMonitor::Queue
private

Definition at line 102 of file SocketMonitor.h.

◆ Sockets

typedef std::set< int > FIX::SocketMonitor::Sockets
private

Definition at line 101 of file SocketMonitor.h.

Constructor & Destructor Documentation

◆ SocketMonitor()

FIX::SocketMonitor::SocketMonitor ( int  timeout = 0)

Definition at line 52 of file SocketMonitor.cpp.

55 {
56  Sockets::iterator i;
57  for ( i = m_readSockets.begin(); i != m_readSockets.end(); ++i ) {
58  socket_close( *i );
59  }
60 
62  socket_term();
63 }
64 
65 bool SocketMonitor::addConnect( int s )
66 {
67  socket_setnonblock( s );
68  Sockets::iterator i = m_connectSockets.find( s );
69  if( i != m_connectSockets.end() ) return false;

◆ ~SocketMonitor()

FIX::SocketMonitor::~SocketMonitor ( )
virtual

Definition at line 71 of file SocketMonitor.cpp.

76 {
77  socket_setnonblock( s );
78  Sockets::iterator i = m_readSockets.find( s );
79  if( i != m_readSockets.end() ) return false;
80 

Member Function Documentation

◆ addConnect()

bool FIX::SocketMonitor::addConnect ( int  socket)

Definition at line 82 of file SocketMonitor.cpp.

86 {
87  if( m_readSockets.find(s) == m_readSockets.end() )
88  return false;
89 
90  socket_setnonblock( s );

◆ addRead()

bool FIX::SocketMonitor::addRead ( int  socket)

Definition at line 92 of file SocketMonitor.cpp.

99 {
100  Sockets::iterator i = m_readSockets.find( s );

◆ addWrite()

bool FIX::SocketMonitor::addWrite ( int  socket)

Definition at line 102 of file SocketMonitor.cpp.

107  {
108  socket_close( s );
109  m_readSockets.erase( s );
110  m_writeSockets.erase( s );
111  m_connectSockets.erase( s );
112  m_dropped.push( s );
113  return true;

References m_connectSockets, m_dropped, m_readSockets, m_writeSockets, and FIX::socket_close().

Referenced by processReadSet().

◆ bind()

bool FIX::SocketMonitor::bind ( )
private

◆ block()

void FIX::SocketMonitor::block ( Strategy strategy,
bool  poll = 0,
double  timeout = 0.0 
)

Definition at line 198 of file SocketMonitor.cpp.

203  {
204  strategy.onTimeout( *this );
205  return;
206  }
207 
208  int result = select( FD_SETSIZE, &readSet, &writeSet, &exceptSet, getTimeval(poll, timeout) );
209 
210  if ( result == 0 )
211  {
212  strategy.onTimeout( *this );
213  return;
214  }
215  else if ( result > 0 )
216  {
217  processExceptSet( strategy, exceptSet );
218  processWriteSet( strategy, writeSet );
219  processReadSet( strategy, readSet );
220  }
221  else
222  {
223  strategy.onError( *this );
224  }
225 }
226 
227 void SocketMonitor::processReadSet( Strategy& strategy, fd_set& readSet )
228 {
229 #ifdef _MSC_VER
230  for ( unsigned i = 0; i < readSet.fd_count; ++i )
231  {
232  int s = readSet.fd_array[ i ];
233  if( s == m_interrupt )
234  {
235  int socket = 0;
236  socket_recv( s, (char*)&socket, sizeof(socket) );
237  addWrite( socket );
238  }
239  else
240  {
241  strategy.onEvent( *this, s );
242  }

◆ buildSet()

void FIX::SocketMonitor::buildSet ( const Sockets sockets,
fd_set &  watchSet 
)
private

Definition at line 345 of file SocketMonitor.cpp.

◆ drop()

bool FIX::SocketMonitor::drop ( int  socket)

Definition at line 115 of file SocketMonitor.cpp.

119 {
120  if ( poll )
121  {
122  m_timeval.tv_sec = 0;
123  m_timeval.tv_usec = 0;
124  return &m_timeval;
125  }
126 
127  timeout = m_timeout;
128 
129  if ( !timeout )
130  return 0;
131 #ifdef SELECT_MODIFIES_TIMEVAL
132  if ( !m_timeval.tv_sec && !m_timeval.tv_usec && timeout )
133  m_timeval.tv_sec = timeout;

◆ getTimeval()

timeval * FIX::SocketMonitor::getTimeval ( bool  poll,
double  timeout 
)
inlineprivate

Definition at line 135 of file SocketMonitor.cpp.

138  {
139  m_ticks = clock();
140  m_timeval.tv_sec = 0;
141  m_timeval.tv_usec = (long)(timeout * 1000000);
142  }
143  else
144  {
145  m_timeval.tv_sec = 0;
146  m_timeval.tv_usec = (long)( ( timeout - elapsed ) * 1000000 );
147  }
148  return &m_timeval;
149 #endif
150 }
151 
152 bool SocketMonitor::sleepIfEmpty( bool poll )
153 {
154  if( poll )
155  return false;
156 
157  if ( m_readSockets.empty() &&
158  m_writeSockets.empty() &&
159  m_connectSockets.empty() )
160  {
162  return true;
163  }
164  else
165  return false;
166 }
167 

References m_ticks, and m_timeval.

◆ listen()

bool FIX::SocketMonitor::listen ( )
private

◆ numSockets()

size_t FIX::SocketMonitor::numSockets ( )
inline

Definition at line 97 of file SocketMonitor.h.

97  :
98  virtual ~Strategy()

◆ processExceptSet()

void FIX::SocketMonitor::processExceptSet ( Strategy strategy,
fd_set &  exceptSet 
)
private

Definition at line 324 of file SocketMonitor.cpp.

329 {
330  Sockets::const_iterator iter;
331  for ( iter = sockets.begin(); iter != sockets.end(); ++iter ) {
332  FD_SET( *iter, &watchSet );
333  }
334 }
335 }

◆ processReadSet()

void FIX::SocketMonitor::processReadSet ( Strategy strategy,
fd_set &  readSet 
)
private

Definition at line 244 of file SocketMonitor.cpp.

248  {
249  int s = *i;
250  if ( !FD_ISSET( *i, &readSet ) )
251  continue;
252  if( s == m_interrupt )
253  {
254  int socket = 0;
255  socket_recv( s, (char*)&socket, sizeof(socket) );
256  addWrite( socket );
257  }
258  else
259  {
260  strategy.onEvent( *this, s );
261  }
262  }
263 #endif
264 }
265 
266 void SocketMonitor::processWriteSet( Strategy& strategy, fd_set& writeSet )
267 {
268 #ifdef _MSC_VER
269  for ( unsigned i = 0; i < writeSet.fd_count; ++i )
270  {
271  int s = writeSet.fd_array[ i ];
272  if( m_connectSockets.find(s) != m_connectSockets.end() )
273  {
274  m_connectSockets.erase( s );
275  m_readSockets.insert( s );
276  strategy.onConnect( *this, s );
277  }
278  else
279  {
280  strategy.onWrite( *this, s );
281  }

References addWrite(), m_interrupt, and FIX::socket_recv().

◆ processWriteSet()

void FIX::SocketMonitor::processWriteSet ( Strategy strategy,
fd_set &  writeSet 
)
private

Definition at line 283 of file SocketMonitor.cpp.

287  {
288  int s = *i;
289  if ( !FD_ISSET( *i, &writeSet ) )
290  continue;
291  m_connectSockets.erase( s );
292  m_readSockets.insert( s );
293  strategy.onConnect( *this, s );
294  }
295 
296  sockets = m_writeSockets;
297  for( i = sockets.begin(); i != sockets.end(); ++i )
298  {
299  int s = *i;
300  if ( !FD_ISSET( *i, &writeSet ) )
301  continue;
302  strategy.onWrite( *this, s );
303  }
304 #endif
305 }
306 
307 void SocketMonitor::processExceptSet( Strategy& strategy, fd_set& exceptSet )
308 {
309 #ifdef _MSC_VER
310  for ( unsigned i = 0; i < exceptSet.fd_count; ++i )
311  {
312  int s = exceptSet.fd_array[ i ];
313  strategy.onError( *this, s );
314  }
315 #else
316  Sockets::iterator i;
317  Sockets sockets = m_connectSockets;
318  for ( i = sockets.begin(); i != sockets.end(); ++i )
319  {
320  int s = *i;
321  if ( !FD_ISSET( *i, &exceptSet ) )
322  continue;

References m_connectSockets, and m_readSockets.

◆ setsockopt()

void FIX::SocketMonitor::setsockopt ( )
private

◆ signal()

void FIX::SocketMonitor::signal ( int  socket)

Definition at line 185 of file SocketMonitor.cpp.

203  {

◆ sleepIfEmpty()

bool FIX::SocketMonitor::sleepIfEmpty ( bool  poll)
inlineprivate

Definition at line 169 of file SocketMonitor.cpp.

169 {
170  socket_send( m_signal, (char*)&socket, sizeof(socket) );
171 }
172 
173 void SocketMonitor::unsignal( int s )
174 {
175  Sockets::iterator i = m_writeSockets.find( s );
176  if( i == m_writeSockets.end() ) return;
177 
178  m_writeSockets.erase( s );
179 }
180 
181 void SocketMonitor::block( Strategy& strategy, bool poll, double timeout )
182 {
183  while ( m_dropped.size() )

References m_signal, and FIX::socket_send().

◆ unsignal()

void FIX::SocketMonitor::unsignal ( int  socket)

Definition at line 190 of file SocketMonitor.cpp.

203  {

Member Data Documentation

◆ m_connectSockets

Sockets FIX::SocketMonitor::m_connectSockets
private

Definition at line 123 of file SocketMonitor.h.

Referenced by addWrite(), and processWriteSet().

◆ m_dropped

Queue FIX::SocketMonitor::m_dropped
private

Definition at line 126 of file SocketMonitor.h.

Referenced by addWrite().

◆ m_interrupt

int FIX::SocketMonitor::m_interrupt
private

Definition at line 122 of file SocketMonitor.h.

Referenced by processReadSet().

◆ m_readSockets

Sockets FIX::SocketMonitor::m_readSockets
private

Definition at line 124 of file SocketMonitor.h.

Referenced by addWrite(), and processWriteSet().

◆ m_signal

int FIX::SocketMonitor::m_signal
private

Definition at line 121 of file SocketMonitor.h.

Referenced by sleepIfEmpty().

◆ m_ticks

clock_t FIX::SocketMonitor::m_ticks
private

Definition at line 118 of file SocketMonitor.h.

Referenced by getTimeval().

◆ m_timeout

int FIX::SocketMonitor::m_timeout
private

Definition at line 115 of file SocketMonitor.h.

◆ m_timeval

timeval FIX::SocketMonitor::m_timeval
private

Definition at line 116 of file SocketMonitor.h.

Referenced by getTimeval().

◆ m_writeSockets

Sockets FIX::SocketMonitor::m_writeSockets
private

Definition at line 125 of file SocketMonitor.h.

Referenced by addWrite().


The documentation for this class was generated from the following files:
FIX::SocketMonitor::m_timeout
int m_timeout
Definition: SocketMonitor.h:115
FIX::SocketMonitor::unsignal
void unsignal(int socket)
Definition: SocketMonitor.cpp:190
FIX::SocketMonitor::m_signal
int m_signal
Definition: SocketMonitor.h:121
FIX::SocketMonitor::block
void block(Strategy &strategy, bool poll=0, double timeout=0.0)
Definition: SocketMonitor.cpp:198
FIX::SocketMonitor::m_connectSockets
Sockets m_connectSockets
Definition: SocketMonitor.h:123
FIX::SocketMonitor::addWrite
bool addWrite(int socket)
Definition: SocketMonitor.cpp:102
FIX::SocketMonitor::m_interrupt
int m_interrupt
Definition: SocketMonitor.h:122
FIX::SocketMonitor::processWriteSet
void processWriteSet(Strategy &, fd_set &)
Definition: SocketMonitor.cpp:283
FIX::SocketMonitor::m_readSockets
Sockets m_readSockets
Definition: SocketMonitor.h:124
FIX::SocketMonitor::addConnect
bool addConnect(int socket)
Definition: SocketMonitor.cpp:82
FIX::socket_term
void socket_term()
Definition: Utility.cpp:113
FIX::SocketMonitor::sleepIfEmpty
bool sleepIfEmpty(bool poll)
Definition: SocketMonitor.cpp:169
FIX::socket_recv
ssize_t socket_recv(int s, char *buf, size_t length)
Definition: Utility.cpp:187
FIX::socket_send
ssize_t socket_send(int s, const char *msg, size_t length)
Definition: Utility.cpp:192
FIX::SocketMonitor::m_writeSockets
Sockets m_writeSockets
Definition: SocketMonitor.h:125
FIX::SocketMonitor::getTimeval
timeval * getTimeval(bool poll, double timeout)
Definition: SocketMonitor.cpp:135
FIX::process_sleep
void process_sleep(double s)
Definition: Utility.cpp:483
FIX::SocketMonitor::m_ticks
clock_t m_ticks
Definition: SocketMonitor.h:118
FIX::socket_setnonblock
void socket_setnonblock(int socket)
Definition: Utility.cpp:285
FIX::socket_close
void socket_close(int s)
Definition: Utility.cpp:197
FIX::SocketMonitor::processExceptSet
void processExceptSet(Strategy &, fd_set &)
Definition: SocketMonitor.cpp:324
FIX::SocketMonitor::m_timeval
timeval m_timeval
Definition: SocketMonitor.h:116
FIX::SocketMonitor::processReadSet
void processReadSet(Strategy &, fd_set &)
Definition: SocketMonitor.cpp:244
FIX::SocketMonitor::Sockets
std::set< int > Sockets
Definition: SocketMonitor.h:101
FIX::SocketMonitor::m_dropped
Queue m_dropped
Definition: SocketMonitor.h:126

Generated on Wed Apr 29 2020 19:41:30 for QuickFIX by doxygen 1.8.17 written by Dimitri van Heesch, © 1997-2001