librnr  1.14.5
RoadNarrows Robotics Common Library 1
sockset.h File Reference

Socket Sets services definitions. More...

#include <sys/time.h>
#include <sys/select.h>
#include "rnr/rnrconfig.h"
#include "rnr/log.h"
#include "rnr/sock.h"

Go to the source code of this file.

Classes

struct  SockSetIter_T
 

Macros

#define SOCK_SET_ONHOLD   0
 on-hold socket descriptor set
 
#define SOCK_SET_ACTIVE   1
 active socket descriptor set
 
#define SOCK_SET_SELECTED   2
 post select() selected socket desc. set
 
#define SOCK_SET_NUMOF   3
 number of managed socket descriptor sets
 
#define SOCK_SET_CHK_SET(set, ...)   CHKEXPR_INT(set, ((set) >= 0) && ((set) < SOCK_SET_NUMOF), __VA_ARGS__)
 Check socket set enum. More...
 

Typedefs

typedef struct sockset_t SockSet_T
 

Functions

SockSet_TSockSetNew ()
 Allocate a new SockSet. More...
 
void SockSetDelete (SockSet_T *pSockSet)
 Delete an allocated SockSet. More...
 
int SockSetAdd (SockSet_T *pSockSet, Socket_T *pSocket, bool_t bActivateRead, bool_t bActivateWrite)
 Add a Socket to a SockSet. More...
 
int SockSetRemove (SockSet_T *pSockSet, Socket_T *pSocket)
 Remove Socket from SockSet. More...
 
int SockSetActivate (SockSet_T *pSockSet, Socket_T *pSocket, bool_t bActivateRead, bool_t bActivateWrite)
 Activate Socket read/write operations in SockSet. More...
 
int SockSetPutOnHold (SockSet_T *pSockSet, Socket_T *pSocket, bool_t bHoldRead, bool_t bHoldWrite)
 Put Socket read/write operations in SockSet on hold. More...
 
int SockSetSelect (SockSet_T *pSockSet, struct timeval *pTimeOut)
 Perform select() on SockSet's Active sets. More...
 
Socket_TSockSetIterFirst (SockSet_T *pSockSet, int eSet, int eIO, SockSetIter_T *pIter)
 Start iteration of Sockets in the given set in SockSet. More...
 
Socket_TSockSetIterNext (SockSetIter_T *pIter)
 Next Socket in iteration over the initialized socket set of SockSet. More...
 

Detailed Description

Socket Sets services definitions.

Note
These socket functions were inspired by the camserv socket.c functions written by Jon Travis (jtrav.nosp@m.is@p.nosp@m.00p.o.nosp@m.rg)
Package
RoadNarrows Robotics Common Library 1
Library
librnr
File
rnr/sockset.h
Author
Robin Knight (robin.nosp@m..kni.nosp@m.ght@r.nosp@m.oadn.nosp@m.arrow.nosp@m.s.co.nosp@m.m)
License
MIT
EULA
See the README and EULA files for any copyright and licensing information.

Definition in file sockset.h.

Macro Definition Documentation

#define SOCK_SET_CHK_SET (   set,
  ... 
)    CHKEXPR_INT(set, ((set) >= 0) && ((set) < SOCK_SET_NUMOF), __VA_ARGS__)

Check socket set enum.

Parameters
setSocket descriptor set enum.

Definition at line 72 of file sockset.h.

Referenced by SockSetIterFirst().

Typedef Documentation

typedef struct sockset_t SockSet_T

The Socket Set Structure

Definition at line 46 of file sockset.h.

Function Documentation

int SockSetActivate ( SockSet_T pSockSet,
Socket_T pSocket,
bool_t  bActivateRead,
bool_t  bActivateWrite 
)

Activate Socket read/write operations in SockSet.

Socket is already part of the SockSet.

Parameters
pSockSetPointer to SockSet.
pSocketPointer to Socket.
bActivateReadDo [not] add to active read set.
bActivateWriteDo [not] add to active write set.
Returns
Returns OK(0) on success, ≤ 0 on error.

Definition at line 377 of file sockset.c.

References CHKPTR, fdclr_nowarn(), fdset_nowarn(), sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, OK, SOCK_IO_READ, SOCK_IO_WRITE, SOCK_RC_EBADSOCK, SockSetChkSd(), and SockSetFindHighestSd().

381 {
382  int sd; // socket descriptor
383 
384  CHKPTR(pSockSet, SOCK_RC_EBADSOCK);
385 
386  // Check data and return socket descriptor
387  if( (sd = SockSetChkSd(pSocket)) < 0 )
388  {
389  return sd;
390  }
391 
392  if( bActivateRead )
393  {
394  fdclr_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_READ]));
395  fdset_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_READ]));
396  if( sd > pSockSet->m_sdHighest )
397  {
398  pSockSet->m_sdHighest = sd;
399  }
400  }
401 
402  if( bActivateWrite )
403  {
404  fdclr_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_WRITE]));
405  fdset_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_WRITE]));
406  if( sd > pSockSet->m_sdHighest )
407  {
408  pSockSet->m_sdHighest = sd;
409  }
410  }
411 
412  pSockSet->m_sdHighest = SockSetFindHighestSd(pSockSet);
413 
414  return OK;
415 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define OK
Okay.
Definition: rnrconfig.h:301
static void fdclr_nowarn(int fd, fd_set *pset)
FD_CLR() wrapper with no annoying warnings.
Definition: sockset.c:107
static int SockSetChkSd(Socket_T *pSocket)
Check if socket is open and within valid range.
Definition: sockset.c:194
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
static void fdset_nowarn(int fd, fd_set *pset)
FD_SET() wrapper with no annoying warnings.
Definition: sockset.c:97
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
static int SockSetFindHighestSd(SockSet_T *pSockSet)
Find the highest socket descriptor number in the Active subset.
Definition: sockset.c:165
int SockSetAdd ( SockSet_T pSockSet,
Socket_T pSocket,
bool_t  bActivateRead,
bool_t  bActivateWrite 
)

Add a Socket to a SockSet.

Socket is added to either the on-hold or active socket set, depending on the given boolean value.

Parameters
pSockSetPointer to SockSet.
pSocketPointer to Socket.
bActivateReadDo [not] add to active read set.
bActivateWriteDo [not] add to active write set.
Returns
Returns OK(0) on success, ≤ 0 on error.

Definition at line 272 of file sockset.c.

References _TBOOL, _TPTR, _TSTR, CHKPTR, fdset_nowarn(), LOGDIAG4CALL, sockset_t::m_pSocket, sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, OK, SOCK_IO_READ, SOCK_IO_WRITE, SOCK_RC_EBADSOCK, SocketAttrGetLocalName(), and SockSetChkSd().

276 {
277  int sd; // socket descriptor
278 
279  CHKPTR(pSockSet, SOCK_RC_EBADSOCK);
280 
281  // Check data and return socket descriptor
282  if( (sd = SockSetChkSd(pSocket)) < 0 )
283  {
284  return sd;
285  }
286 
287  LOGDIAG4CALL(_TPTR(pSockSet), _TSTR(SocketAttrGetLocalName(pSocket)),
288  _TBOOL(bActivateRead), _TBOOL(bActivateWrite));
289 
290  //
291  // Add sd to appropriate read socket descriptor set
292  //
293  if( bActivateRead ) // place read in the active set
294  {
295  fdset_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_READ]));
296  if( pSockSet->m_sdHighest < sd )
297  {
298  pSockSet->m_sdHighest = sd;
299  }
300  }
301  else // place read in the on-hold set
302  {
303  fdset_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_READ]));
304  }
305 
306  //
307  // Add sd to appropriate write socket descriptor set
308  //
309  if( bActivateWrite ) // place write in the active set
310  {
311  fdset_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_WRITE]));
312  if( pSockSet->m_sdHighest < sd )
313  {
314  pSockSet->m_sdHighest = sd;
315  }
316  }
317  else // place write in the on-hold set
318  {
319  fdset_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_WRITE]));
320  }
321 
322  // add socket
323  pSockSet->m_pSocket[sd] = pSocket;
324 
325  return OK;
326 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
const char * SocketAttrGetLocalName(Socket_T *pSocket)
Get Socket local name.
Definition: sock.c:632
#define OK
Okay.
Definition: rnrconfig.h:301
Socket_T * m_pSocket[FD_SETSIZE]
associated sockets
Definition: sockset.c:155
static int SockSetChkSd(Socket_T *pSocket)
Check if socket is open and within valid range.
Definition: sockset.c:194
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
#define _TBOOL(var)
boolean
Definition: log.h:588
#define _TSTR(var)
string variable
Definition: log.h:578
static void fdset_nowarn(int fd, fd_set *pset)
FD_SET() wrapper with no annoying warnings.
Definition: sockset.c:97
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
void SockSetDelete ( SockSet_T pSockSet)

Delete an allocated SockSet.

Parameters
pSockSetPointer to SockSet.

Definition at line 250 of file sockset.c.

References NULL.

251 {
252  if( pSockSet == NULL )
253  {
254  return;
255  }
256  delete(pSockSet);
257 }
#define NULL
null pointer
Definition: rnrconfig.h:199
Socket_T* SockSetIterFirst ( SockSet_T pSockSet,
int  eSet,
int  eIO,
SockSetIter_T pIter 
)

Start iteration of Sockets in the given set in SockSet.

Parameters
pSockSetPointer to SockSet.
eSetOne of: SOCK_SET_ONHOLD SOCK_SET_ACTIVE SOCK_SET_SELECTED.
eIOOne of: SOCK_IO_READ SOCK_IO_WRITE.
pIterSockSet interator.
Returns
Pointer to first Socket if found, else NULL.

Definition at line 548 of file sockset.c.

References CHKPTR, SockSetIter_T::m_eIO, SockSetIter_T::m_eSet, SockSetIter_T::m_pSockSet, SockSetIter_T::m_sdCur, SockSetIter_T::m_sdSet, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, sockset_t::m_sdSetSelect, NULL, SOCK_CHK_IO, SOCK_SET_ACTIVE, SOCK_SET_CHK_SET, SOCK_SET_ONHOLD, SOCK_SET_SELECTED, and SockSetIterNext().

552 {
553  CHKPTR(pSockSet, NULL);
554  SOCK_SET_CHK_SET(eSet, NULL);
555  SOCK_CHK_IO(eIO, NULL);
556  CHKPTR(pIter, NULL);
557 
558  pIter->m_pSockSet = pSockSet;
559  pIter->m_eSet = eSet;
560  pIter->m_eIO = eIO;
561  pIter->m_sdCur = -1;
562 
563  switch(eSet)
564  {
565  case SOCK_SET_ONHOLD:
566  pIter->m_sdSet = pSockSet->m_sdSetOnHold[eIO];
567  break;
568  case SOCK_SET_ACTIVE:
569  pIter->m_sdSet = pSockSet->m_sdSetActive[eIO];
570  break;
571  case SOCK_SET_SELECTED:
572  default:
573  pIter->m_sdSet = pSockSet->m_sdSetSelect[eIO];
574  break;
575  }
576 
577  return SockSetIterNext(pIter);
578 }
int m_sdCur
current iterator position
Definition: sockset.h:56
#define SOCK_SET_CHK_SET(set,...)
Check socket set enum.
Definition: sockset.h:72
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
#define SOCK_SET_ACTIVE
active socket descriptor set
Definition: sockset.h:64
Socket_T * SockSetIterNext(SockSetIter_T *pIter)
Next Socket in iteration over the initialized socket set of SockSet.
Definition: sockset.c:587
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define SOCK_SET_SELECTED
post select() selected socket desc. set
Definition: sockset.h:65
#define SOCK_SET_ONHOLD
on-hold socket descriptor set
Definition: sockset.h:63
SockSet_T * m_pSockSet
socket set
Definition: sockset.h:53
#define SOCK_CHK_IO(io,...)
Check I/O index.
Definition: sock.h:138
int m_eIO
which read/write subset to iterate over
Definition: sockset.h:55
fd_set m_sdSet
set to iterate over
Definition: sockset.h:57
fd_set m_sdSetSelect[SOCK_IO_NUMOF]
select socket descriptor set
Definition: sockset.c:152
int m_eSet
which socket set to iterate over
Definition: sockset.h:54
Socket_T* SockSetIterNext ( SockSetIter_T pIter)

Next Socket in iteration over the initialized socket set of SockSet.

Parameters
pIterSockSet interator.
Returns
Pointer to next Socket if found, else NULL.

Definition at line 587 of file sockset.c.

References CHKPTR, fdisset_nowarn(), sockset_t::m_pSocket, SockSetIter_T::m_pSockSet, SockSetIter_T::m_sdCur, SockSetIter_T::m_sdSet, and NULL.

Referenced by SockSetIterFirst().

588 {
589  int sd;
590 
591  CHKPTR(pIter, NULL);
592  CHKPTR(pIter->m_pSockSet, NULL);
593 
594  for(sd = pIter->m_sdCur + 1; sd <= pIter->m_pSockSet->m_sdHighest; ++sd)
595  {
596  if( fdisset_nowarn(sd, &(pIter->m_sdSet)) )
597  {
598  pIter->m_sdCur = sd;
599  return pIter->m_pSockSet->m_pSocket[sd];
600  }
601  }
602 
603  // no more selected sockets found
604  pIter->m_sdCur = sd;
605 
606  return NULL;
607 }
int m_sdCur
current iterator position
Definition: sockset.h:56
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
static int fdisset_nowarn(int fd, fd_set *pset)
FD_ISSET() wrapper with no annoying warnings.
Definition: sockset.c:118
Socket_T * m_pSocket[FD_SETSIZE]
associated sockets
Definition: sockset.c:155
SockSet_T * m_pSockSet
socket set
Definition: sockset.h:53
fd_set m_sdSet
set to iterate over
Definition: sockset.h:57
SockSet_T* SockSetNew ( )

Allocate a new SockSet.

Returns
Pointer to allocated SockSet.

Definition at line 229 of file sockset.c.

References sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, sockset_t::m_sdSetSelect, NEW, SOCK_IO_READ, and SOCK_IO_WRITE.

230 {
231  SockSet_T *pSockSet = NEW(SockSet_T);
232 
233  pSockSet->m_sdHighest = -1;
234 
235  FD_ZERO(&(pSockSet->m_sdSetSelect[SOCK_IO_READ]));
236  FD_ZERO(&(pSockSet->m_sdSetSelect[SOCK_IO_WRITE]));
237  FD_ZERO(&(pSockSet->m_sdSetActive[SOCK_IO_READ]));
238  FD_ZERO(&(pSockSet->m_sdSetActive[SOCK_IO_WRITE]));
239  FD_ZERO(&(pSockSet->m_sdSetOnHold[SOCK_IO_READ]));
240  FD_ZERO(&(pSockSet->m_sdSetOnHold[SOCK_IO_WRITE]));
241 
242  return pSockSet;
243 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
Socket Set Structure.
Definition: sockset.c:149
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define NEW(T)
Allocate new type.
Definition: new.h:49
fd_set m_sdSetSelect[SOCK_IO_NUMOF]
select socket descriptor set
Definition: sockset.c:152
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
int SockSetPutOnHold ( SockSet_T pSockSet,
Socket_T pSocket,
bool_t  bHoldRead,
bool_t  bHoldWrite 
)

Put Socket read/write operations in SockSet on hold.

Socket is already part of the SockSet.

Parameters
pSockSetPointer to SockSet.
pSocketPointer to Socket.
bHoldReadDo [not] add to hold read set.
bHoldWriteDo [not] add to hold write set.
Returns
Returns OK(0) on success, ≤ 0 on error.

Definition at line 429 of file sockset.c.

References CHKPTR, fdclr_nowarn(), fdset_nowarn(), sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, OK, SOCK_IO_READ, SOCK_IO_WRITE, SOCK_RC_EBADSOCK, SockSetChkSd(), and SockSetFindHighestSd().

433 {
434  int sd; // socket descriptor
435 
436  CHKPTR(pSockSet, SOCK_RC_EBADSOCK);
437 
438  // Check data and return socket descriptor
439  if( (sd = SockSetChkSd(pSocket)) < 0 )
440  {
441  return sd;
442  }
443 
444  if( bHoldRead )
445  {
446  fdclr_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_READ]));
447  fdset_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_READ]));
448  }
449 
450  if( bHoldWrite )
451  {
452  fdclr_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_WRITE]));
453  fdset_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_WRITE]));
454  }
455 
456  pSockSet->m_sdHighest = SockSetFindHighestSd(pSockSet);
457 
458  return OK;
459 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define OK
Okay.
Definition: rnrconfig.h:301
static void fdclr_nowarn(int fd, fd_set *pset)
FD_CLR() wrapper with no annoying warnings.
Definition: sockset.c:107
static int SockSetChkSd(Socket_T *pSocket)
Check if socket is open and within valid range.
Definition: sockset.c:194
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
static void fdset_nowarn(int fd, fd_set *pset)
FD_SET() wrapper with no annoying warnings.
Definition: sockset.c:97
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
static int SockSetFindHighestSd(SockSet_T *pSockSet)
Find the highest socket descriptor number in the Active subset.
Definition: sockset.c:165
int SockSetRemove ( SockSet_T pSockSet,
Socket_T pSocket 
)

Remove Socket from SockSet.

Parameters
pSockSetPointer to SockSet.
pSocketPointer to Socket.
Returns
Returns OK(0) on success, ≤ 0 on error.

Definition at line 336 of file sockset.c.

References _TPTR, _TSTR, CHKPTR, fdclr_nowarn(), LOGDIAG4CALL, sockset_t::m_pSocket, sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetOnHold, NULL, OK, SOCK_IO_READ, SOCK_IO_WRITE, SOCK_RC_EBADSOCK, SocketAttrGetLocalName(), SockSetChkSd(), and SockSetFindHighestSd().

337 {
338  int sd; // socket descriptor
339 
340  CHKPTR(pSockSet, SOCK_RC_EBADSOCK);
341 
342  // Check data and return socket descriptor
343  if( (sd = SockSetChkSd(pSocket)) < 0 )
344  {
345  return sd;
346  }
347 
348  LOGDIAG4CALL(_TPTR(pSockSet), _TSTR(SocketAttrGetLocalName(pSocket)));
349 
350  // remove socket descriptor from all sets
351  fdclr_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_READ]));
352  fdclr_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_READ]));
353  fdclr_nowarn(sd, &(pSockSet->m_sdSetActive[SOCK_IO_WRITE]));
354  fdclr_nowarn(sd, &(pSockSet->m_sdSetOnHold[SOCK_IO_WRITE]));
355 
356  // remove socket
357  pSockSet->m_pSocket[sd] = NULL;
358 
359  // find new highest socket descriptor
360  pSockSet->m_sdHighest = SockSetFindHighestSd(pSockSet);
361 
362  return OK;
363 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
const char * SocketAttrGetLocalName(Socket_T *pSocket)
Get Socket local name.
Definition: sock.c:632
#define OK
Okay.
Definition: rnrconfig.h:301
#define NULL
null pointer
Definition: rnrconfig.h:199
Socket_T * m_pSocket[FD_SETSIZE]
associated sockets
Definition: sockset.c:155
static void fdclr_nowarn(int fd, fd_set *pset)
FD_CLR() wrapper with no annoying warnings.
Definition: sockset.c:107
static int SockSetChkSd(Socket_T *pSocket)
Check if socket is open and within valid range.
Definition: sockset.c:194
fd_set m_sdSetOnHold[SOCK_IO_NUMOF]
on-hold socket descriptor set
Definition: sockset.c:154
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
#define _TSTR(var)
string variable
Definition: log.h:578
#define _TPTR(var)
pointer
Definition: log.h:587
#define LOGDIAG4CALL(...)
Standard Diagnostic Level 4 function call tracing.
Definition: log.h:442
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131
static int SockSetFindHighestSd(SockSet_T *pSockSet)
Find the highest socket descriptor number in the Active subset.
Definition: sockset.c:165
int SockSetSelect ( SockSet_T pSockSet,
struct timeval *  pTimeOut 
)

Perform select() on SockSet's Active sets.

Parameters
pSockSetPointer to SockSet.
pTimeOutSelect time out.
Returns
On success, returns number of socket descriptors found in the active state.
On time out, returns 0.
On error, returns ≤ 0.

Definition at line 472 of file sockset.c.

References CHKPTR, LOGERROR, LOGSYSERROR, sockset_t::m_sdHighest, sockset_t::m_sdSetActive, sockset_t::m_sdSetSelect, NULL, SOCK_IO_READ, SOCK_IO_WRITE, SOCK_RC_EBADSOCK, SOCK_RC_EFAIL, and SOCK_RC_ESYSERR.

473 {
474  struct timeval tvSave = {0, 0}; // saved timeout value
475  int nSd; // number of socket descriptors selected
476  int nTries = 0; // number of tries when interrupted
477 
478  CHKPTR(pSockSet, SOCK_RC_EBADSOCK);
479 
480  // save timeout value - can get munged by select()
481  if( pTimeOut != NULL )
482  {
483  tvSave = *pTimeOut;
484  }
485 
486  //
487  // Try at most three times to select.
488  //
489  while(nTries++ < 3)
490  {
491  // build select read/write sets
492  pSockSet->m_sdSetSelect[SOCK_IO_READ] =
493  pSockSet->m_sdSetActive[SOCK_IO_READ];
494  pSockSet->m_sdSetSelect[SOCK_IO_WRITE] =
495  pSockSet->m_sdSetActive[SOCK_IO_WRITE];
496 
497  //
498  // Wait with timeout (optional) for read/write availability
499  //
500  nSd = select(pSockSet->m_sdHighest+1,
501  &(pSockSet->m_sdSetSelect[SOCK_IO_READ]),
502  &(pSockSet->m_sdSetSelect[SOCK_IO_WRITE]),
503  NULL,
504  pTimeOut);
505 
506  // restore mangled time out
507  if( pTimeOut != NULL )
508  {
509  *pTimeOut = tvSave;
510  }
511 
512  // system error occurred
513  if( nSd < 0 )
514  {
515  switch(errno)
516  {
517  case EINTR: // interrupted - try again
518  break;
519  default:
520  LOGSYSERROR("select()");
521  return SOCK_RC_ESYSERR;
522  }
523  }
524 
525  // read/write sets available or timeout
526  else
527  {
528  return nSd;
529  }
530  }
531 
532  LOGERROR("Failed %d times to select()", nTries);
533 
534  return SOCK_RC_EFAIL;
535 }
#define SOCK_IO_READ
read index
Definition: sock.h:130
#define SOCK_RC_EFAIL
general, unspecified error
Definition: sock.h:119
fd_set m_sdSetActive[SOCK_IO_NUMOF]
active socket descriptor set
Definition: sockset.c:153
#define CHKPTR(p,...)
Checks validity of pointer.
Definition: log.h:651
#define NULL
null pointer
Definition: rnrconfig.h:199
#define LOGSYSERROR(fmt,...)
Standard System Error logging.
Definition: log.h:509
#define LOGERROR(fmt,...)
Standard Error logging.
Definition: log.h:488
#define SOCK_RC_EBADSOCK
socket is bad
Definition: sock.h:122
#define SOCK_RC_ESYSERR
system error occurred
Definition: sock.h:125
fd_set m_sdSetSelect[SOCK_IO_NUMOF]
select socket descriptor set
Definition: sockset.c:152
int m_sdHighest
highest socket descriptor value
Definition: sockset.c:151
#define SOCK_IO_WRITE
write index
Definition: sock.h:131