This is Unofficial EPICS BASE Doxygen Site
epics::pvAccess::BlockingTCPConnector Class Reference

#include "blockingTCP.h"

Public Member Functions

 POINTER_DEFINITIONS (BlockingTCPConnector)
 
 BlockingTCPConnector (Context::shared_pointer const &context, int receiveBufferSize, float beaconInterval)
 
Transport::shared_pointer connect (std::tr1::shared_ptr< ClientChannelImpl > const &client, ResponseHandler::shared_pointer const &responseHandler, osiSockAddr &address, epics::pvData::int8 transportRevision, epics::pvData::int16 priority)
 

Detailed Description

Channel Access TCP connector.

Author
Matej Sekoranja
Version
Id
BlockingTCPConnector.java,v 1.1 2010/05/03 14:45:47 mrkraimer Exp

Definition at line 51 of file blockingTCP.h.

Constructor & Destructor Documentation

epics::pvAccess::BlockingTCPConnector::BlockingTCPConnector ( Context::shared_pointer const &  context,
int  receiveBufferSize,
float  beaconInterval 
)

Definition at line 24 of file blockingTCPConnector.cpp.

27  :
28  _context(context),
29  _receiveBufferSize(receiveBufferSize),
30  _heartbeatInterval(heartbeatInterval)
31 {
32 }

Member Function Documentation

Transport::shared_pointer epics::pvAccess::BlockingTCPConnector::connect ( std::tr1::shared_ptr< ClientChannelImpl > const &  client,
ResponseHandler::shared_pointer const &  responseHandler,
osiSockAddr address,
epics::pvData::int8  transportRevision,
epics::pvData::int16  priority 
)

Definition at line 72 of file blockingTCPConnector.cpp.

74  {
75 
76  SOCKET socket = INVALID_SOCKET;
77 
78  char ipAddrStr[24];
79  ipAddrToDottedIP(&address.ia, ipAddrStr, sizeof(ipAddrStr));
80 
81  Context::shared_pointer context = _context.lock();
82 
83  TransportRegistry::Reservation rsvp(context->getTransportRegistry(),
84  address, priority);
85  // we are now blocking any connect() to this destination (address and prio)
86  // concurrent connect() to other destination is allowed.
87  // This prevents us from opening duplicate connections.
88 
89  Transport::shared_pointer transport = context->getTransportRegistry()->get(address, priority);
90  if(transport.get()) {
92  "Reusing existing connection to PVA server: %s.",
93  ipAddrStr);
94  if (transport->acquire(client))
95  return transport;
96  }
97 
98  try {
99  LOG(logLevelDebug, "Connecting to PVA server: %s.", ipAddrStr);
100 
101  socket = tryConnect(address, 3);
102 
103  LOG(logLevelDebug, "Socket connected to PVA server: %s.", ipAddrStr);
104 
105  // enable TCP_NODELAY (disable Nagle's algorithm)
106  int optval = 1; // true
107  int retval = ::setsockopt(socket, IPPROTO_TCP, TCP_NODELAY,
108  (char *)&optval, sizeof(int));
109  if(retval<0) {
110  char errStr[64];
111  epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
112  LOG(logLevelWarn, "Error setting TCP_NODELAY: %s.", errStr);
113  }
114 
115  // enable TCP_KEEPALIVE
116  retval = ::setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE,
117  (char *)&optval, sizeof(int));
118  if(retval<0)
119  {
120  char errStr[64];
121  epicsSocketConvertErrnoToString(errStr, sizeof(errStr));
122  LOG(logLevelWarn, "Error setting SO_KEEPALIVE: %s.", errStr);
123  }
124 
125  // TODO tune buffer sizes?! Win32 defaults are 8k, which is OK
126 
127  // create transport
128  // TODO introduce factory
129  // get TCP send buffer size
130  osiSocklen_t intLen = sizeof(int);
131  int _socketSendBufferSize;
132  retval = getsockopt(socket, SOL_SOCKET, SO_SNDBUF, (char *)&_socketSendBufferSize, &intLen);
133  if(retval<0) {
134  char strBuffer[64];
135  epicsSocketConvertErrnoToString(strBuffer, sizeof(strBuffer));
136  LOG(logLevelDebug, "Error getting SO_SNDBUF: %s.", strBuffer);
137  }
138 
139  // create() also adds to context connection pool _context->getTransportRegistry()
141  context, socket, responseHandler, _receiveBufferSize, _socketSendBufferSize,
142  client, transportRevision, _heartbeatInterval, priority);
143 
144  // verify
145  if(!transport->verify(5000)) {
146  LOG(
148  "Connection to PVA server %s failed to be validated, closing it.",
149  ipAddrStr);
150 
151  std::ostringstream temp;
152  temp<<"Failed to verify TCP connection to '"<<ipAddrStr<<"'.";
153  THROW_BASE_EXCEPTION(temp.str().c_str());
154  }
155 
156  LOG(logLevelDebug, "Connected to PVA server: %s.", ipAddrStr);
157 
158  return transport;
159  } catch(std::exception&) {
160  if(transport.get())
161  transport->close();
162  else if(socket!=INVALID_SOCKET)
163  epicsSocketDestroy(socket);
164  throw;
165  }
166 }
LIBCOM_API void epicsStdCall epicsSocketDestroy(SOCKET s)
Definition: osdSock.c:117
static shared_pointer create(Context::shared_pointer const &context, SOCKET channel, ResponseHandler::shared_pointer const &responseHandler, int32_t sendBufferSize, int32_t receiveBufferSize, std::tr1::shared_ptr< ClientChannelImpl > const &client, int8_t remoteTransportRevision, float heartbeatInterval, int16_t priority)
Definition: codec.h:579
#define INVALID_SOCKET
Definition: osdSock.h:32
int osiSocklen_t
Definition: osdSock.h:36
struct sockaddr_in ia
Definition: osiSock.h:157
void epicsSocketConvertErrnoToString(char *pBuf, unsigned bufSize)
#define LOG(level, format,...)
Definition: logger.h:48
Definition: server.h:76
int SOCKET
Definition: osdSock.h:31
#define THROW_BASE_EXCEPTION(msg)
unsigned epicsStdCall ipAddrToDottedIP(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)
Definition: osiSock.c:144
epics::pvAccess::BlockingTCPConnector::POINTER_DEFINITIONS ( BlockingTCPConnector  )

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