4 #include "otsdaq/NetworkUtilities/TCPServerBase.h"
5 #include "otsdaq/NetworkUtilities/TCPTransmitterSocket.h"
16 TCPServerBase::TCPServerBase(
int serverPort,
unsigned int maxNumberOfClients)
17 : fMaxNumberOfClients(maxNumberOfClients)
19 , fAcceptFuture(fAcceptPromise.get_future())
22 if(::setsockopt(getSocketId(), SOL_SOCKET, SO_REUSEADDR, &opt,
sizeof(opt)) != 0)
25 throw std::runtime_error(std::string(
"Setsockopt: ") + strerror(errno));
28 struct sockaddr_in serverAddr;
29 bzero((
char*)&serverAddr,
sizeof(serverAddr));
30 serverAddr.sin_family = AF_INET;
31 serverAddr.sin_port = htons(serverPort);
32 serverAddr.sin_addr.s_addr = INADDR_ANY;
34 if(::bind(getSocketId(), (
struct sockaddr*)&serverAddr,
sizeof(serverAddr)) != 0)
37 throw std::runtime_error(std::string(
"Bind: ") + strerror(errno));
40 if(::listen(getSocketId(), fMaxConnectionBacklog) != 0)
43 throw std::runtime_error(std::string(
"Listen: ") + strerror(errno));
49 TCPServerBase::~TCPServerBase(
void)
51 std::cout << __PRETTY_FUNCTION__
52 <<
"Closing the network server socket: " << getSocketId() << std::endl;
53 std::cout << __PRETTY_FUNCTION__
54 <<
"SHUTDOWN Closing the network server socket: " << getSocketId()
57 std::cout << __PRETTY_FUNCTION__
58 <<
"Closing the network server socket: " << getSocketId() << std::endl;
59 while(fAcceptFuture.wait_for(std::chrono::milliseconds(100)) !=
60 std::future_status::ready)
61 std::cout << __PRETTY_FUNCTION__ <<
"Still running" << std::endl;
63 std::cout << __PRETTY_FUNCTION__
64 <<
"Closed all sockets connected to server: " << getSocketId() << std::endl;
68 void TCPServerBase::startAccept(
void)
70 std::thread thread(&TCPServerBase::acceptConnections,
this);
76 int TCPServerBase::accept(
bool blocking)
78 std::cout << __PRETTY_FUNCTION__
79 <<
"Now server accept connections on socket: " << getSocketId()
81 if(getSocketId() == invalidSocketId)
83 throw std::logic_error(
84 "Accept called on a bad socket object (this object was moved)");
87 struct sockaddr_storage serverStorage;
88 socklen_t addr_size =
sizeof serverStorage;
89 int clientSocket = invalidSocketId;
93 ::accept(getSocketId(), (
struct sockaddr*)&serverStorage, &addr_size);
99 if(clientSocket == invalidSocketId)
101 std::cout << __PRETTY_FUNCTION__ <<
"New socket invalid?: " << clientSocket
102 <<
" errno: " << errno << std::endl;
103 throw std::runtime_error(std::string(
"Accept: ") + strerror(errno));
105 std::cout << __PRETTY_FUNCTION__
106 <<
"Server just accepted a connection on socket: " << getSocketId()
107 <<
" Client socket: " << clientSocket << std::endl;
112 constexpr
int sleepMSeconds = 5;
113 constexpr
int timeoutSeconds = 0;
114 constexpr
int timeoutUSeconds = 1000;
115 struct timeval timeout;
116 timeout.tv_sec = timeoutSeconds;
117 timeout.tv_usec = timeoutUSeconds;
124 FD_SET(getSocketId(), &fdSet);
125 select(getSocketId() + 1, &fdSet, 0, 0, &timeout);
127 if(FD_ISSET(getSocketId(), &fdSet))
129 struct sockaddr_in clientAddress;
130 socklen_t socketSize =
sizeof(clientAddress);
133 clientSocket = ::accept(getSocketId(),
134 (
struct sockaddr*)&clientAddress,
137 if(clientSocket == invalidSocketId)
139 std::cout << __PRETTY_FUNCTION__
140 <<
"New socket invalid?: " << clientSocket
141 <<
" errno: " << errno << std::endl;
142 throw std::runtime_error(std::string(
"Accept: ") + strerror(errno));
146 std::this_thread::sleep_for(std::chrono::milliseconds(sleepMSeconds));
154 void TCPServerBase::closeClientSockets(
void)
156 for(
auto& socket : fConnectedClients)
158 socket.second->sendClose();
159 delete socket.second;
161 fConnectedClients.clear();
165 void TCPServerBase::closeClientSocket(
int socket)
167 for(
auto it = fConnectedClients.begin(); it != fConnectedClients.end(); it++)
168 if(it->second->getSocketId() == socket)
170 it->second->sendClose();
172 fConnectedClients.erase(it);
177 void TCPServerBase::broadcastPacket(
const std::string& message)
179 for(
auto& socket : fConnectedClients)
184 void TCPServerBase::broadcast(
const std::string& message)
186 for(
auto& socket : fConnectedClients)
191 void TCPServerBase::broadcast(
const std::vector<char>& message)
193 for(
auto& socket : fConnectedClients)
198 void TCPServerBase::shutdownAccept()
201 shutdown(getSocketId(), SHUT_RD);