14 #define epicsExportSharedSymbols 20 using std::ostringstream;
26 BlockingTCPAcceptor::BlockingTCPAcceptor(Context::shared_pointer
const & context,
27 ResponseHandler::shared_pointer
const & responseHandler,
30 _responseHandler(responseHandler),
33 _receiveBufferSize(receiveBufferSize),
35 _thread(*this,
"TCP-acceptor",
48 int BlockingTCPAcceptor::initialize() {
63 temp<<
"Socket create error: "<<strBuffer;
72 int retval = ::bind(_serverSocketChannel, &_bindAddress.
sa,
sizeof(sockaddr));
76 if(_bindAddress.
ia.sin_port!=0) {
81 "Configured TCP port %d is unavailable, trying to assign it dynamically.",
82 ntohs(_bindAddress.
ia.sin_port));
83 _bindAddress.
ia.sin_port = htons(0);
94 if(ntohs(_bindAddress.
ia.sin_port)==0) {
97 retval = ::getsockname(_serverSocketChannel, &_bindAddress.
sa, &sockLen);
106 "Using dynamically assigned TCP port %d.",
107 ntohs(_bindAddress.
ia.sin_port));
111 retval = ::listen(_serverSocketChannel, 4);
115 temp<<
"Socket listen error: "<<strBuffer;
123 return ntohs(_bindAddress.
ia.sin_port);
130 temp<<
"Failed to create acceptor to "<<ipAddrStr;
134 void BlockingTCPAcceptor::run() {
140 bool socketOpen =
true;
150 sock = _serverSocketChannel;
164 int retval = ::setsockopt(newClient, IPPROTO_TCP, TCP_NODELAY, (
char *)&optval,
sizeof(
int));
171 retval = ::setsockopt(newClient, SOL_SOCKET, SO_KEEPALIVE, (
char *)&optval,
sizeof(
int));
181 int _socketSendBufferSize;
182 retval = getsockopt(newClient, SOL_SOCKET, SO_SNDBUF, (
char *)&_socketSendBufferSize, &intLen);
191 detail::BlockingServerTCPTransportCodec::shared_pointer transport =
196 _socketSendBufferSize,
200 if(!validateConnection(transport, ipAddrStr)) {
209 "Connection to PVA client %s failed to be validated, closing it.",
222 bool BlockingTCPAcceptor::validateConnection(Transport::shared_pointer
const & transport,
const char* address) {
224 return transport->verify(5000);
235 if(_destroyed)
return;
238 sock = _serverSocketChannel;
static shared_pointer create(Context::shared_pointer const &context, SOCKET channel, ResponseHandler::shared_pointer const &responseHandler, int sendBufferSize, int receiveBufferSize)
LIBCOM_API void epicsStdCall epicsSocketDestroy(SOCKET s)
#define epicsThreadPriorityMedium
enum epicsSocketSystemCallInterruptMechanismQueryInfo epicsSocketSystemCallInterruptMechanismQuery()
TODO only here because of the Lockable.
A lock for multithreading.
virtual ~BlockingTCPAcceptor()
LIBCOM_API unsigned int epicsStdCall epicsThreadGetStackSize(epicsThreadStackSizeClass size)
void epicsSocketConvertErrnoToString(char *pBuf, unsigned bufSize)
LIBCOM_API SOCKET epicsStdCall epicsSocketCreate(int domain, int type, int protocol)
#define LOG(level, format,...)
LIBCOM_API int epicsStdCall epicsSocketAccept(int sock, struct sockaddr *pAddr, osiSocklen_t *addrlen)
#define THROW_BASE_EXCEPTION(msg)
LIBCOM_API void epicsStdCall epicsThreadSleep(double seconds)
Block the calling thread for at least the specified time.
C++ and C descriptions for a thread.
unsigned epicsStdCall ipAddrToDottedIP(const struct sockaddr_in *paddr, char *pBuf, unsigned bufSize)