13 #define epicsExportSharedSymbols 24 BlockingTCPConnector::BlockingTCPConnector(
25 Context::shared_pointer
const & context,
26 int receiveBufferSize,
27 float heartbeatInterval) :
29 _receiveBufferSize(receiveBufferSize),
30 _heartbeatInterval(heartbeatInterval)
39 for(
int tryCount = 0; tryCount<tries; tryCount++) {
42 "Opening socket to PVA server %s, attempt %d.",
43 strBuffer, tryCount+1);
49 std::ostringstream temp;
50 temp<<
"Socket create error: "<<strBuffer;
55 if(::
connect(socket, &address.
sa,
sizeof(sockaddr))==0) {
63 std::ostringstream temp;
64 temp<<
"error connecting to "<<saddr<<
" : "<<strBuffer;
65 throw std::runtime_error(temp.str());
73 ResponseHandler::shared_pointer
const & responseHandler,
osiSockAddr& address,
81 Context::shared_pointer context = _context.lock();
89 Transport::shared_pointer transport = context->getTransportRegistry()->get(address, priority);
92 "Reusing existing connection to PVA server: %s.",
94 if (transport->acquire(client))
101 socket = tryConnect(address, 3);
107 int retval = ::setsockopt(socket, IPPROTO_TCP, TCP_NODELAY,
108 (
char *)&optval,
sizeof(
int));
116 retval = ::setsockopt(socket, SOL_SOCKET, SO_KEEPALIVE,
117 (
char *)&optval,
sizeof(
int));
131 int _socketSendBufferSize;
132 retval = getsockopt(socket, SOL_SOCKET, SO_SNDBUF, (
char *)&_socketSendBufferSize, &intLen);
141 context, socket, responseHandler, _receiveBufferSize, _socketSendBufferSize,
142 client, transportRevision, _heartbeatInterval, priority);
145 if(!transport->verify(5000)) {
148 "Connection to PVA server %s failed to be validated, closing it.",
151 std::ostringstream temp;
152 temp<<
"Failed to verify TCP connection to '"<<ipAddrStr<<
"'.";
159 }
catch(std::exception&) {
LIBCOM_API void epicsStdCall epicsSocketDestroy(SOCKET s)
unsigned epicsStdCall sockAddrToDottedIP(const struct sockaddr *paddr, char *pBuf, unsigned bufSize)
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)
#define THROW_EXCEPTION2(TYPE, MSG)
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)
TODO only here because of the Lockable.
void epicsSocketConvertErrnoToString(char *pBuf, unsigned bufSize)
LIBCOM_API SOCKET epicsStdCall epicsSocketCreate(int domain, int type, int protocol)
#define LOG(level, format,...)
#define THROW_BASE_EXCEPTION(msg)
C++ and C descriptions for a thread.
unsigned epicsStdCall ipAddrToDottedIP(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)