Jpp
JLigierObjectIterator.hh
Go to the documentation of this file.
1 #ifndef __JNET__JLIGIEROBJECTITERATOR__
2 #define __JNET__JLIGIEROBJECTITERATOR__
3 
4 #include <vector>
5 #include <exception>
6 
8 #include "JNet/JPrefix.hh"
9 #include "JNet/JServerSocket.hh"
10 #include "JNet/JSocketChannel.hh"
11 #include "JNet/JSelectReader.hh"
12 
13 
14 /**
15  * \author mdejong
16  */
17 
18 namespace JNET {}
19 namespace JPP { using namespace JNET; }
20 
21 namespace JNET {
22 
24 
26 
27 
28  /**
29  * Get total size of internet packet.
30  *
31  * \param prefix prefix
32  * \return number of bytes
33  */
34  inline int getSizeOfPacket(const JPrefix& prefix)
35  {
36  return prefix.getSize() + sizeof(JPrefix);
37  }
38 
39 
40 
41  /**
42  * Object iteration through ControlHost server.
43  * This class implements the JLANG::JObjectIterator interface.
44  */
45  template<class T>
47  public JServerSocket,
48  public JAbstractObjectIterator<T>,
49  public std::vector<JSocketInputChannel_t>
50  {
51  public:
52 
53  /**
54  * Constructor.
55  *
56  * \param port server port
57  * \param backlog server backlog
58  * \param buffer_size socket buffer size
59  * \param timeout_us timeout [us]
60  */
61  JLigierObjectIterator(const int port,
62  const int backlog,
63  const int buffer_size = 262144,
64  const int timeout_us = 10) :
65  JServerSocket(port,backlog),
68  {}
69 
70 
71  /**
72  * Set object.
73  *
74  * \param object reference to object to be set
75  * \return true if set; else false
76  */
77  virtual bool setObject(T& object)
78  {
79  using namespace std;
80 
81  for ( ; ; ) {
82 
83  select.reset();
85 
86  for (const_iterator channel = this->begin(); channel != this->end(); ++channel) {
87  if (!channel->isReady()) {
88  select.setReaderMask(channel->getFileDescriptor());
89  }
90  }
91 
92  if (select(timeout_us) > 0) {
93 
94  for (iterator channel = this->begin(); channel != this->end(); ) {
95 
96  if (select.hasReaderMask(*channel)) {
97 
98  try {
99 
100  channel->read();
101 
102  if (channel->isReady()) {
103 
104  if (channel->prefix.getTag() == getTag<T>()) {
105 
106  channel->seekg(sizeof(JPrefix));
107 
108  *channel >> object; // read object
109 
110  channel->reset();
111 
112  return true;
113 
114  } else {
115 
116  channel->reset(); // skip data
117  }
118  }
119  }
120  catch(const exception& error) {
121 
122  channel->shutdown();
123 
124  channel = this->erase(channel);
125 
126  continue;
127  }
128  }
129 
130  ++channel;
131  }
132 
133  if (select.hasReaderMask(*this)) {
134 
135  JSocket socket;
136 
137  socket.accept(this->getFileDescriptor());
138 
139  //socket.setSendBufferSize (buffer_size);
141 
142  socket.setKeepAlive (true);
143  socket.setNonBlocking(true);
144 
145  this->push_back(JSocketInputChannel_t(socket));
146  }
147  }
148  }
149 
150  return false;
151  }
152 
153  private:
157  };
158 }
159 
160 #endif
JLANG::JAbstractFile::getFileDescriptor
int getFileDescriptor() const
Get file descriptor.
Definition: JAbstractFile.hh:75
JLANG::JAbstractObjectIterator::object
T object
object
Definition: JAbstractObjectIterator.hh:34
std::iterator
Definition: JSTDTypes.hh:18
JNET::JServerSocket
TCP Server socket.
Definition: JServerSocket.hh:27
JNET::JPrefix
ControlHost prefix.
Definition: JPrefix.hh:31
JAbstractObjectIterator.hh
JNET::JSocketInputChannel_t
JSocketInputChannel< JPrefix_t > JSocketInputChannel_t
Definition: JLigier.cc:30
std::vector
Definition: JSTDTypes.hh:12
JNET::JLigierObjectIterator::select
JSelectReader select
Definition: JLigierObjectIterator.hh:154
JServerSocket.hh
JNET::JSocket
Socket class.
Definition: JSocket.hh:42
JNET::JLigierObjectIterator
Object iteration through ControlHost server.
Definition: JLigierObjectIterator.hh:46
JNET
Interprocess communication.
Definition: JDataFilter.cc:66
JNET::JSelectReader::reset
void reset()
Reset.
Definition: JSelectReader.hh:78
JNET::JSocket::setReceiveBufferSize
void setReceiveBufferSize(const int size)
Set receive buffer size.
Definition: JSocket.hh:250
JNET::JSelectReader
Wrapper class for select call.
Definition: JSelectReader.hh:32
JPP
This name space includes all other name spaces (except KM3NETDAQ, KM3NET and ANTARES).
Definition: JAAnetToolkit.hh:37
JNET::JSelectReader::hasReaderMask
bool hasReaderMask(const JAbstractFile &file) const
Has reader file.
Definition: JSelectReader.hh:69
JNET::JSocket::accept
void accept(const int server)
Accept connection from a server.
Definition: JSocket.hh:372
JSelectReader.hh
JPrefix.hh
JLANG::JAbstractObjectIterator
Abstract object iterator.
Definition: JAbstractObjectIterator.hh:23
JNET::JSocket::setKeepAlive
void setKeepAlive(const bool on)
Set keep alive of socket.
Definition: JSocket.hh:151
JSocketChannel.hh
JNET::JSelectReader::setReaderMask
void setReaderMask(const JAbstractFile &file)
Set reader mask.
Definition: JSelectReader.hh:57
JNET::JSocket::setNonBlocking
void setNonBlocking(const bool on)
Set non-blocking of I/O.
Definition: JSocket.hh:109
std
Definition: jaanetDictionary.h:36
JNET::JLigierObjectIterator::setObject
virtual bool setObject(T &object)
Set object.
Definition: JLigierObjectIterator.hh:77
JNET::JLigierObjectIterator::timeout_us
int timeout_us
Definition: JLigierObjectIterator.hh:156
JNET::JLigierObjectIterator::JLigierObjectIterator
JLigierObjectIterator(const int port, const int backlog, const int buffer_size=262144, const int timeout_us=10)
Constructor.
Definition: JLigierObjectIterator.hh:61
JNET::JLigierObjectIterator::buffer_size
int buffer_size
Definition: JLigierObjectIterator.hh:155
JNET::JPrefix::getSize
int getSize() const
Get size.
Definition: JPrefix.hh:62
JNET::getSizeOfPacket
int getSizeOfPacket(const KM3NETDAQ::JDAQAbstractPreamble &preamble)
Get size of packeet.
Definition: JDataFilter.cc:75
JNET::JSocketInputChannel
Socket input channel.
Definition: JSocketChannel.hh:86