This is Unofficial EPICS BASE Doxygen Site
repeaterClient Class Reference

#include "repeaterClient.h"

+ Inheritance diagram for repeaterClient:
+ Collaboration diagram for repeaterClient:

Public Member Functions

 repeaterClient (const osiSockAddr &from)
 
 ~repeaterClient ()
 
bool connect ()
 
bool sendConfirm ()
 
bool sendMessage (const void *pBuf, unsigned bufSize)
 
bool verify ()
 
bool identicalAddress (const osiSockAddr &from)
 
bool identicalPort (const osiSockAddr &from)
 
void * operator new (size_t size, tsFreeList< repeaterClient, 0x20 > &)
 
unsigned short port () const
 
void operator delete (void *)
 
- Public Member Functions inherited from tsDLNode< repeaterClient >
 tsDLNode ()
 
 tsDLNode (const tsDLNode< repeaterClient > &)
 
const tsDLNode< repeaterClient > & operator= (const tsDLNode< repeaterClient > &)
 

Public Attributes

epicsPlacementDeleteOperator((void *, tsFreeList< repeaterClient, 0x20 > &)) private SOCKE sock )
 

Detailed Description

Definition at line 40 of file repeaterClient.h.

Constructor & Destructor Documentation

repeaterClient::repeaterClient ( const osiSockAddr from)

Definition at line 127 of file repeater.cpp.

127  :
128  from ( fromIn ), sock ( INVALID_SOCKET )
129 {
130 #ifdef DEBUG
131  unsigned port = ntohs ( from.ia.sin_port );
132  debugPrintf ( ( "new client %u\n", port ) );
133 #endif
134 }
#define INVALID_SOCKET
Definition: osdSock.h:32
struct sockaddr_in ia
Definition: osiSock.h:157
epicsPlacementDeleteOperator((void *, tsFreeList< repeaterClient, 0x20 > &)) private SOCKE sock)
unsigned short port() const
Definition: repeater.cpp:254
#define debugPrintf(argsInParen)
Definition: iocinf.h:30
repeaterClient::~repeaterClient ( )

Definition at line 218 of file repeater.cpp.

219 {
220  if ( this->sock != INVALID_SOCKET ) {
221  epicsSocketDestroy ( this->sock );
222  }
223 #ifdef DEBUG
224  epicsUInt16 port = ntohs ( this->from.ia.sin_port );
225  debugPrintf ( ( "Deleted client %u\n", port ) );
226 #endif
227 }
LIBCOM_API void epicsStdCall epicsSocketDestroy(SOCKET s)
Definition: osdSock.c:117
#define INVALID_SOCKET
Definition: osdSock.h:32
unsigned short epicsUInt16
Definition: epicsTypes.h:41
epicsPlacementDeleteOperator((void *, tsFreeList< repeaterClient, 0x20 > &)) private SOCKE sock)
unsigned short port() const
Definition: repeater.cpp:254
#define debugPrintf(argsInParen)
Definition: iocinf.h:30

Member Function Documentation

bool repeaterClient::connect ( )

Definition at line 136 of file repeater.cpp.

137 {
138  int status;
139 
140  if ( int sockerrno = makeSocket ( PORT_ANY, false, & this->sock ) ) {
141  char sockErrBuf[64];
143  sockErrBuf, sizeof ( sockErrBuf ), sockerrno );
144  fprintf ( stderr, "%s: no client sock because \"%s\"\n",
145  __FILE__, sockErrBuf );
146  return false;
147  }
148 
149  status = ::connect ( this->sock, &this->from.sa, sizeof ( this->from.sa ) );
150  if ( status < 0 ) {
151  char sockErrBuf[64];
153  sockErrBuf, sizeof ( sockErrBuf ) );
154  fprintf ( stderr, "%s: unable to connect client sock because \"%s\"\n",
155  __FILE__, sockErrBuf );
156  return false;
157  }
158 
159  return true;
160 }
pvd::Status status
epicsPlacementDeleteOperator((void *, tsFreeList< repeaterClient, 0x20 > &)) private SOCKE sock)
void epicsSocketConvertErrnoToString(char *pBuf, unsigned bufSize)
bool connect()
Definition: repeater.cpp:136
#define stderr
Definition: epicsStdio.h:32
void epicsSocketConvertErrorToString(char *pBuf, unsigned bufSize, int theSockError)
bool repeaterClient::identicalAddress ( const osiSockAddr from)
inline

Definition at line 259 of file repeater.cpp.

260 {
261  if ( fromIn.sa.sa_family == this->from.sa.sa_family ) {
262  if ( fromIn.ia.sin_port == this->from.ia.sin_port) {
263  if ( fromIn.ia.sin_addr.s_addr == this->from.ia.sin_addr.s_addr ) {
264  return true;
265  }
266  }
267  }
268  return false;
269 }
bool repeaterClient::identicalPort ( const osiSockAddr from)
inline

Definition at line 271 of file repeater.cpp.

272 {
273  if ( fromIn.sa.sa_family == this->from.sa.sa_family ) {
274  if ( fromIn.ia.sin_port == this->from.ia.sin_port) {
275  return true;
276  }
277  }
278  return false;
279 }
void repeaterClient::operator delete ( void *  )

Definition at line 229 of file repeater.cpp.

230 {
231  // Visual C++ .net appears to require operator delete if
232  // placement operator delete is defined? I smell a ms rat
233  // because if I declare placement new and delete, but
234  // comment out the placement delete definition there are
235  // no undefined symbols.
236  errlogPrintf ( "%s:%d this compiler is confused about placement delete - memory was probably leaked",
237  __FILE__, __LINE__ );
238 }
int errlogPrintf(const char *pFormat,...)
Definition: errlog.c:105
void * repeaterClient::operator new ( size_t  size,
tsFreeList< repeaterClient, 0x20 > &  freeList 
)

Definition at line 240 of file repeater.cpp.

242 {
243  return freeList.allocate ( size );
244 }
void * allocate(size_t size)
Definition: tsFreeList.h:126
unsigned short repeaterClient::port ( ) const
inline

Definition at line 254 of file repeater.cpp.

255 {
256  return ntohs ( this->from.ia.sin_port );
257 }
bool repeaterClient::sendConfirm ( )

Definition at line 162 of file repeater.cpp.

163 {
164  int status;
165 
166  caHdr confirm;
167  memset ( (char *) &confirm, '\0', sizeof (confirm) );
169  confirm.m_available = this->from.ia.sin_addr.s_addr;
170  status = send ( this->sock, (char *) &confirm,
171  sizeof (confirm), 0 );
172  if ( status >= 0 ) {
173  assert ( status == sizeof ( confirm ) );
174  return true;
175  }
176  else if ( SOCKERRNO == SOCK_ECONNREFUSED ) {
177  return false;
178  }
179  else {
180  char sockErrBuf[64];
182  sockErrBuf, sizeof ( sockErrBuf ) );
183  debugPrintf ( ( "CA Repeater: confirm req err was \"%s\"\n", sockErrBuf) );
184  return false;
185  }
186 }
#define SOCK_ECONNREFUSED
Definition: osdSock.h:58
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
pvd::Status status
ca_uint32_t m_available
Definition: caProto.h:166
epicsPlacementDeleteOperator((void *, tsFreeList< repeaterClient, 0x20 > &)) private SOCKE sock)
void epicsSocketConvertErrnoToString(char *pBuf, unsigned bufSize)
ca_uint16_t m_cmmd
Definition: caProto.h:161
#define REPEATER_CONFIRM
Definition: caProto.h:100
#define SOCKERRNO
Definition: osdSock.h:33
#define debugPrintf(argsInParen)
Definition: iocinf.h:30
bool repeaterClient::sendMessage ( const void *  pBuf,
unsigned  bufSize 
)

Definition at line 188 of file repeater.cpp.

189 {
190  int status;
191 
192  status = send ( this->sock, (char *) pBuf, bufSize, 0 );
193  if ( status >= 0 ) {
194  assert ( static_cast <unsigned> ( status ) == bufSize );
195 #ifdef DEBUG
196  epicsUInt16 port = ntohs ( this->from.ia.sin_port );
197  debugPrintf ( ("Sent to %u\n", port ) );
198 #endif
199  return true;
200  }
201  else {
202  int errnoCpy = SOCKERRNO;
203  if ( errnoCpy == SOCK_ECONNREFUSED ) {
204 #ifdef DEBUG
205  epicsUInt16 port = ntohs ( this->from.ia.sin_port );
206  debugPrintf ( ("Client refused message %u\n", port ) );
207 #endif
208  }
209  else {
210  char sockErrBuf[64];
211  epicsSocketConvertErrnoToString ( sockErrBuf, sizeof ( sockErrBuf ) );
212  debugPrintf ( ( "CA Repeater: UDP send err was \"%s\"\n", sockErrBuf) );
213  }
214  return false;
215  }
216 }
#define SOCK_ECONNREFUSED
Definition: osdSock.h:58
#define assert(exp)
Declare that a condition should be true.
Definition: epicsAssert.h:70
pvd::Status status
unsigned short epicsUInt16
Definition: epicsTypes.h:41
epicsPlacementDeleteOperator((void *, tsFreeList< repeaterClient, 0x20 > &)) private SOCKE sock)
unsigned short port() const
Definition: repeater.cpp:254
void epicsSocketConvertErrnoToString(char *pBuf, unsigned bufSize)
#define SOCKERRNO
Definition: osdSock.h:33
#define debugPrintf(argsInParen)
Definition: iocinf.h:30
bool repeaterClient::verify ( )

Definition at line 281 of file repeater.cpp.

282 {
283  SOCKET tmpSock;
284  int sockerrno = makeSocket ( this->port (), false, & tmpSock );
285 
286  if ( sockerrno == SOCK_EADDRINUSE ) {
287  // Normal result, client using port
288  return true;
289  }
290 
291  if ( sockerrno == 0 ) {
292  // Client went away, released port
293  epicsSocketDestroy ( tmpSock );
294  }
295  else {
296  char sockErrBuf[64];
298  sockErrBuf, sizeof ( sockErrBuf ), sockerrno );
299  fprintf ( stderr, "CA Repeater: Bind test error \"%s\"\n",
300  sockErrBuf );
301  }
302  return false;
303 }
LIBCOM_API void epicsStdCall epicsSocketDestroy(SOCKET s)
Definition: osdSock.c:117
#define SOCK_EADDRINUSE
Definition: osdSock.h:56
unsigned short port() const
Definition: repeater.cpp:254
int SOCKET
Definition: osdSock.h:31
#define stderr
Definition: epicsStdio.h:32
void epicsSocketConvertErrorToString(char *pBuf, unsigned bufSize, int theSockError)

Member Data Documentation

epicsPlacementDeleteOperator (( void *, tsFreeList < repeaterClient, 0x20 > & )) private SOCKE repeaterClient::sock)

Definition at line 52 of file repeaterClient.h.


The documentation for this class was generated from the following files: