otsdaq  3.03.00
TCPListenServer.h
1 #ifndef _TCPListenServer_h_
2 #define _TCPListenServer_h_
3 
4 #include "otsdaq/NetworkUtilities/TCPReceiverSocket.h"
5 #include "otsdaq/NetworkUtilities/TCPServerBase.h"
6 
7 #include "TRACE/trace.h"
8 
9 namespace ots
10 {
12 {
13  public:
14  TCPListenServer(unsigned int serverPort, unsigned int maxNumberOfClients = -1);
15  virtual ~TCPListenServer(void);
16 
17  template<class T>
18  T receive();
19  std::string receivePacket();
20 
21  protected:
22  void acceptConnections() override;
23  int lastReceived;
24 };
25 template<class T>
26 inline T TCPListenServer::receive()
27 {
28  if(!fConnectedClients.empty())
29  {
30  auto it = fConnectedClients.find(lastReceived);
31  if(it == fConnectedClients.end() || ++it == fConnectedClients.end())
32  it = fConnectedClients.begin();
33  lastReceived = it->first;
34  TLOG(25, "TCPListenServer")
35  << "Reading from socket " << lastReceived << ", there are "
36  << fConnectedClients.size() << " clients connected.";
37  return dynamic_cast<TCPReceiverSocket*>(it->second)->receive<T>();
38  }
39  throw std::runtime_error("No clients connected!");
40 }
41 } // namespace ots
42 #endif