iop_simplenet.h
Go to the documentation of this file.
1 /** @file iop_simplenet.h Simple networked events via TCP/IP */
2 
3 /*
4  FAU Discrete Event Systems Library (libfaudes)
5 
6  Copyright (C) 2008, Thomas Moor
7  Exclusive copyright is granted to Klaus Schmidt
8 
9 */
10 
11 
12 
13 #ifndef FAUDES_IOP_SIMPLENET_H
14 #define FAUDES_IOP_SIMPLENET_H
15 
16 #include "corefaudes.h"
17 #include "iop_vdevice.h"
18 
19 
20 namespace faudes {
21 
22 
23 /**
24  * Simplenet node address.
25  *
26  * A node address consists of an IP address and a TCP port.
27  * This convenience class implements string based access to both components.
28  *
29  */
30 
32 
33 public:
34 
35  /** Default constructor */
36  SimplenetAddress(void);
37 
38  /** Copy construct */
39  SimplenetAddress(const SimplenetAddress& rOther);
40 
41  /** Construct from string */
42  SimplenetAddress(const std::string& rString);
43 
44  /** Return true if valid */
45  bool Valid(void) const;
46 
47  /** Get IP address */
48  std::string Ip(void) const { return mIp; };
49 
50  /** Get TCP port */
51  int Port(void) const { return mPort; };
52 
53  /** Get as colon seperated string */
54  std::string IpColonPort(void) const;
55 
56  /** Set IP address */
57  void Ip(std::string ip) { mIp=ip; };
58 
59  /** Set TCP port */
60  void Port(int port) { mPort=port; };
61 
62  /** Set from colon seperated string */
63  void IpColonPort(std::string ipcolonport);
64 
65  /** Order for sorting containers of addresses */
66  bool operator < (const SimplenetAddress& rOther) const;
67 
68  protected:
69 
70  /** Ip address */
71  std::string mIp;
72 
73  /** TCP port */
74  int mPort;
75 
76 };
77 
78 
79 
80 // only compile for simplenet support
81 #ifdef FAUDES_IODEVICE_SIMPLENET
82 
83 
84 
85 
86 /**
87  * Configuration of a network output mapping.
88  *
89  * There is nothing to configure here: any client that
90  * connects to this device can subscribe to any output event.
91  * Future versions of libFAUDES may specify a set of receipent
92  * clients.
93  *
94  */
95 
97 
99 
100 public:
101 
102  /** Default constructor */
104 
105  /** Test for default value (always, since we have no data) */
106  virtual bool IsDefault(void) const {return true;};
107 
108  /** Clear to default */
109  virtual void Clear(void) {};
110 
111 protected:
112 
113  /** Copy method
114  *
115  * @param rSrcAttr
116  * Source to copy from
117  * @return
118  * Ref to this attribute
119  */
120  void DoAssign(const AttributeSimplenetOutput& rSrcAttr)
121  {(void) rSrcAttr;};
122 
123  /**
124  * Reads the attribute from TokenReader, see AttributeVoid for public wrappers.
125  *
126  * If the current token indicates a input mapping, the method reads that
127  * section. Else it does nothing. Exceptions may only be thrown
128  * on invalid data within the section. The label argument is ignored, we use the
129  * hardcoded section "Output" for output attributes. The context argument is ignored.
130  *
131  * @param rTr
132  * TokenReader to read from
133  * @param rLabel
134  * Section to read
135  * @param pContext
136  * Read context to provide contextual information
137  *
138  * @exception Exception
139  * - IO error (id 1)
140  */
141  virtual void DoRead(TokenReader& rTr,const std::string& rLabel="", const Type* pContext=0);
142 
143  /**
144  * Writes the attribute to TokenWriter, see AttributeVoid for public wrappers.
145  *
146  * Writes the output mapping data. The label argument is ignored, we use
147  * the hardcoded section "Output". The context argument is ignored.
148  *
149  * @param rTw
150  * TokenWriter to write to
151  * @param rLabel
152  * Section to write
153  * @param pContext
154  * Read context to provide contextual information
155  *
156  * @exception Exception
157  * - IO error (id 2)
158  */
159  virtual void DoWrite(TokenWriter& rTw,const std::string& rLabel="", const Type* pContext=0) const;
160 
161 }; // end class AttributeSimplenetOutput
162 
163 
164 /**
165  * Configuration of a network input mapping.
166  *
167  * There is nothing to configure here: any server that
168  * provides the repective event will be accepted. Future versions
169  * of libFAUDES may specify a set of servers here.
170  *
171  */
172 
174 
176 
177 public:
178 
179  /** Default constructor (no triggers) */
181 
182  /** Test for default value (always, since we have no data) */
183  virtual bool IsDefault(void) const {return true;};
184 
185  /** Clear to default */
186  virtual void Clear(void) {};
187 
188 protected:
189 
190  /** Copy method
191  *
192  * @param rSrcAttr
193  * Source to copy from
194  * @return
195  * Ref to this attribute
196  */
197  void DoAssign(const AttributeSimplenetInput& rSrcAttr)
198  {(void) rSrcAttr;};
199 
200 
201  /**
202  * Reads the attribute from TokenReader, see AttributeVoid for public wrappers.
203  *
204  * If the current token indicates a input mapping, the method reads that
205  * section. Else it does nothing. Exceptions may only be thrown
206  * on invalid data within the section. The label argument is ignored, we the hardcoded
207  * section "Input" for input device attributes. The context argument is ignored.
208  *
209  * @param rTr
210  * TokenReader to read from
211  * @param rLabel
212  * Section to read
213  * @param pContext
214  * Read context to provide contextual information
215  *
216  * @exception Exception
217  * - IO error (id 1)
218  */
219  virtual void DoRead(TokenReader& rTr,const std::string& rLabel="", const Type* pContext=0);
220 
221  /**
222  * Writes the attribute to TokenWriter, see AttributeVoid for public wrappers.
223  *
224  * Writes the input mapping data.The label argument is ignored, we use
225  * the hardcoded section "Input". The context argument is ignored.
226  *
227  * @param rTw
228  * TokenWriter to write to
229  * @param rLabel
230  * Section to write
231  * @param pContext
232  * Read context to provide contextual information
233  *
234  * @exception Exception
235  * - IO error (id 2)
236  */
237  virtual void DoWrite(TokenWriter& rTw,const std::string& rLabel="", const Type* pContext=0) const;
238 
239 }; // end class AttributeSimplenetInput
240 
241 
242 
243 /**
244  * Configuration of a networked input or output
245  *
246  * This class is derived from the AttributeDeviceEvent to specialise
247  * for networked input and output mapping.
248  *
249  */
250 
252 
254 
255 public:
256 
257  /** Default constructor (no mapping at all) */
259 
260  /** Copy constructor */
262 
263  /** Test for default value (never) */
264  virtual bool IsDefault(void) const {return false;};
265 
266  /** Clear */
267  virtual void Clear(void) { AttributeDeviceEvent::Clear(); };
268 
269  /** Get output mapping */
270  const AttributeSimplenetOutput* Outputp(void) const {
271  return static_cast<AttributeSimplenetOutput*>(mpOutputAttribute); };
272 
273  /** Get input mapping */
274  const AttributeSimplenetInput* Inputp(void) const {
275  return static_cast<AttributeSimplenetInput*>(mpInputAttribute); };
276 
277 protected:
278 
279  /** DoAssign */
282 
283  /** Prototype, input (construct on first use static) */
284  static const AttributeSimplenetInput* InputPrototypep(void);
285 
286  /** Prototype, output (construct on first use static) */
287  static const AttributeSimplenetOutput* OutputPrototypep(void);
288 
289 }; // class AttributeSimplenetEvent
290 
291 
292 /**
293  * An nDevice implements networked IO via a simple TCP/IP protocol.
294  *
295  * @section SecIodeviceNDev1 Networking
296  *
297  * The purpose of this implementation of networked discrete events is to provide
298  * a basis for case studies. However, simple networked events via nDevice must not
299  * be confused with ongoing research that addresses synchronisation and real
300  * time behaviour. We take a really pragmatic approach here.
301  *
302  * Our <em>network</em> is identified by its <em>network name</em>. It consists
303  * a number of <em>nodes</em>, each identified by its <em>node name</em>. In the current implementation,
304  * each node knows about the entire network ie knows about all other nodes. Each node plays two roles:
305  * - the <em>server</em> role to send event notifications, and
306  * - the <em>client</em> role to receive event notifications.
307  *
308  * In their server role, each node is configured to listen on its <em>server port</em> for incomming
309  * TCP connections. When a client (i.e. some other node in client role) connects to the TCP port, the server
310  * replies to a simple command set in order to allow the client to subscribe to the nodes output events.
311  * When the application executes an output event on the node, this is notified to all connected clients and
312  * the clients will interpret the event as an input reading. Vice versa, the each node itself has the
313  * role of a client and subscribes to relevant output events served by other nodes in their server role.
314  *
315  * @section SecIodeviceNDev2 Protocol Details
316  *
317  * The protocol for commands and notification is libFAUDES-token based and can be inspected eg via nc
318  * or telnet; see the shell script in the tutorial.
319  * Event notifications are sent spontaneous to all connected clients in the format
320  * <tt><Notify> Ev </Notify></tt>.
321  * Commands are accepted in the format <tt><Cmd> Command </Cmd></tt> and will be
322  * answered accordingly.
323  *
324  * <table valign="top">
325  * <tr>
326  * <td> Command via TCP</td>
327  * <td> Reply </td>
328  * </tr>
329  * <tr>
330  * <td> <tt><Cmd> Info </Cmd></tt> </td>
331  * <td> configuration of node as token string (<tt><SimplenetDevice name="SimpleMachine"> ...
332  * </SimplenetDevice> </tt> ) </td>
333  * </tr>
334  * <tr>
335  * <td> <tt><Cmd> Status </Cmd></tt> </td>
336  * <td> acknowledgement with status string (<tt><Ack> Up </Ack></tt>,
337  * <tt><Ack> StartUp </Ack></tt> or <tt><Ack> ShutDown </Ack></tt>, respectively;
338  * will not connect/reply while Down) </td>
339  * </tr>
340  * <tr>
341  * <td> <tt><Cmd> ResetRequest </Cmd></tt> </td>
342  * <td> no acknowledgement </td>
343  * </tr>
344  * <tr>
345  * <td> <tt><Subscribe> Ev_1 ... Ev_N </Subscribe></tt> </td>
346  * <td> subset of available events (e.g. <tt><Subscribed> Ev_2 Ev_7 Ev_9 </Subscribed></tt>)</td>
347  * </tr>
348  * </table>
349  *
350  * A minimal alternative implementation for a node consists of (1) a TCP server that ignores all
351  * incomming messages and issues event notifications to any relevant events; and, (2) a TCP client
352  * that subscribes to all events and then listens to event notifications. All other commands are
353  * optional and may change in future revisions of this protocol.
354  *
355  * @section SecIodeviceNDev3 Name Resolution
356  *
357  * On the technical side, each node needs to figure the IP addresses incl TCP ports on which the
358  * other nodes provide their service. To ease configuration, this information is distributed by
359  * UDP datagrams. In order to locate the other nodes within the network, a node may broadcasts a
360  * network <em>request</em> datagramm. Each node that receives such a request, replies with an
361  * <em>advert</em> datagramm to provide its address. Thus, the simple net nodes rely on some
362  * underlying name resolution by DNS services, but node configuration itself refers to simple-net node names
363  * only. Since each node knows about the names of all participating nodes, each node will know when
364  * all connections are up.
365  *
366  * By default, UDP broadcasts are addressed to 255.255.255.255:40000. Since
367  * routers are not meant to pass-on broadcasts, nDevice name resolution is restricted to
368  * one subnet. If the local host is connected to multiple subnets, you need to specify the
369  * relevant subset explicitly by setting the appropriate broadcast address, e.g. 192.168.2.255:40000.
370  * To restrict networks to the local machine, set the broadcast address to the loopback device
371  * 127.0.0.1:40000. To span a network accross multiple subnets, server addresses can be
372  * explicitly specified as an attribute in the node configuration;
373  * e.g. <tt> <Node> name=\"SimpleSupervisor\" address=\"192.168.2.1:40000\"</Node></tt>.
374  * This is also the preferred
375  * fallback when address resolution fails for other reasons.
376  *
377  * <table valign="top">
378  * <tr>
379  * <td> Broadcast via UDP</td>
380  * <td> Reply </td>
381  * </tr>
382  * <tr>
383  * <td> <tt><Request> network reqnode </Request></tt> </td>
384  * <td> advertisement of networkname, nodename and ip-address:port, e.g.,
385  * <tt> <Advert> SimpleLoop SimpleSupervisor 192.168.2.1:40000 </Advert></tt>
386  * </td>
387  * </tr>
388  * </table>
389  * <p>
390  *
391  * @section SecIodeviceNDev4 File IO
392  *
393  * For token IO, the nDevice reads and writes a section with label
394  * "SimplenetDevice". There are no relevant attributes yet. Simple machine example:
395  *
396  * @code
397  * <SimplenetDevice name="SimpleMachine">
398  *
399  * <!-- Time scale in ms/ftiu -->
400  * <TimeScale value="1000"/>
401  *
402  * <!-- IP address of this node, incl. server TCP port -->
403  * <ServerAddress value="localhost:40000"/>
404 
405  * <!-- Broadcaset address for node resolution (optional)
406  * <BroadcastAddress value="255.255.255.255:40000"/>
407  *
408  * <!-- Network topology -->
409  * <Network name="SimpleLoop">
410  * <Node name="SimpleMachine"/>
411  * <Node name="SimpleSupervisor"/>
412  * </Network>
413  *
414  * <!-- Event configuration -->
415  * <EventConfiguration>
416  * <Event name="alpha" iotype="input"/>
417  * <Event name="beta" iotype="output"/>
418  * <Event name="mue" iotype="output"/>
419  * <Event name="lambda" iotype="input"/>
420  * </EventConfiguration>
421  *
422  * </SimplenetDevice>
423  * @endcode
424  *
425  * @section SecIodeviceNDev5 Implementation Notes
426  *
427  * The current status of the code is premature; network io
428  * assumes reasonably large buffers; thread/select mechanism is inefficient;
429  * exception handling wont work; etc etc
430  *
431  *
432  * @ingroup IODevicePlugin
433  */
434 
435 class FAUDES_API nDevice : public vDevice {
436 
437 FAUDES_TYPE_DECLARATION(SimplenetDevice,nDevice,vDevice)
438 
439  // provide all access to background tasks
440  friend void* NDeviceListen(void*);
441  friend void* NDeviceServer(void*);
442  friend void* NDeviceReply(void*);
443 
444  public:
445  /**
446  * Default constructor
447  */
448  nDevice(void);
449 
450  /**
451  * Explicit destructor.
452  */
453  virtual ~nDevice(void);
454 
455  /**
456  * Clear all configuration.
457  * This implies Stop().
458  */
459  virtual void Clear(void);
460 
461  /**
462  * Set server address of this node.
463  * Note: you can only set th server address while the
464  * device is down.
465  *
466  * @param rAddr
467  * Address on which to run this server, e.g. "localhost:40000"
468  * @exception Exception
469  * - No valid address (id 551) (NOT IMPLEMENTED)
470  */
471  void ServerAddress(const std::string& rAddr);
472 
473  /**
474  * Set broadcast address for address resolution
475  * Note: you can only set the broadcast address while the
476  * device is down.
477  *
478  * @param rAddr
479  * Address for UDP broadcasts e.g. "255.255.255.255:40000"
480  * @exception Exception
481  * - No valid address (id 551) (NOT IMPLEMENTED)
482  */
483  void BroadcastAddress(const std::string& rAddr);
484 
485  /**
486  * Set network name to participate.
487  * Note: you can only set the network name
488  * while the device is down.
489  *
490  * @param rNetwork
491  * Name of network, e.g. "ElevatorNetwork"
492  */
493  void NetworkName(const std::string& rNetwork);
494 
495  /**
496  * Add a node to the network configuration.
497  * Note: you can only configure the network
498  * while the device is down.
499  *
500  * @param rNodeName
501  * Node to participate in wthe network.
502  */
503  void InsNode(const std::string& rNodeName);
504 
505  /**
506  * Add entry to node name resolution
507  *
508  * Note: you can only configure the network
509  * while the device is down.
510  * @param rNode
511  * Name of node to register
512  * @param rAddress
513  * Address incl port
514  */
515  void InsNodeAddress(const std::string& rNode, const std::string& rAddress);
516 
517 
518  /**
519  * Add a node to the network configuration.
520  * Note: you can only configure the network
521  * while the device is down.
522  *
523  */
524  void ClearNodes(void);
525 
526  /**
527  * Insert event as input event.
528  * Note: you can only configure events
529  * while the device is down.
530  *
531  * @param event
532  * Event by name.
533  */
534  void InsInputEvent(const std::string& event);
535 
536 
537  /**
538  * Insert event as output event.
539  * Note: you can only configure event
540  * while the device is down.
541  *
542  * @param event
543  * Event by name.
544  */
545  void InsOutputEvent(const std::string& event);
546 
547 
548  /**
549  * Set up internal data structures
550  *
551  */
552  virtual void Compile(void);
553 
554 
555  /**
556  * Activate the device. This function enables output execution and input reading.
557  * It starts the background thread for incomming connections and tries to connect to relevant servers.
558  *
559  * @exception Exception
560  * - Not yet configured (id 551)
561  * - Fatal network error (id 553)
562  * - Fatal thread error (id 554)
563  */
564  virtual void Start(void);
565 
566  /**
567  * Deactivate the device. This function disables output execution and input reading.
568  * It stops the backhround thread to provide connections and disconnects from any servers.
569  */
570  virtual void Stop(void);
571 
572  /**
573  * Reset device. Resets buffered input events and current time.
574  *
575  */
576  virtual void Reset(void);
577 
578  /**
579  * Run output command.
580  *
581  * @exception Exception
582  * - unknown output event (id 65)
583  */
584  virtual void WriteOutput(Idx output);
585 
586 
587 
588 protected:
589 
590  /**
591  * Actual method to read device configuration from tokenreader.
592  *
593  * This method calls the base class to read the device name and the
594  * the timescale. It then reads address, networkid and nodes.
595  * Overall device configuration is consists of DoReadPreface,
596  * DoReadConfiguration and Compile. It isimplemented in vDevice.
597  * The label and context parameters are ignored.
598  *
599  * @param rTr
600  * TokenReader to read from
601  * @param rLabel
602  * Section to read
603  * @param pContext
604  * Read context to provide contextual information
605  *
606  * @exception Exception
607  * - IO error (id 1)
608  */
609  virtual void DoReadPreface(TokenReader& rTr, const std::string& rLabel = "", const Type* pContext=0);
610 
611  /**
612  * Actual method to write the device configuration to a TokenWriter.
613  *
614  * This method calls the base class vDevice to write the device name and
615  * the time scale. It then writes network related data. The label and
616  * context parameters are ignored.
617  *
618  * @param rTw
619  * Reference to TokenWriter
620  * @param rLabel
621  * Label of section to write
622  * @param pContext
623  * Read context to provide contextual information
624  * @exception Exception
625  * - IO errors (id 2)
626  */
627  virtual void DoWritePreface(TokenWriter& rTw, const std::string& rLabel="", const Type* pContext=0) const;
628 
629 
630  /** Overall configuration (with actual type) */
632 
633  /** Simplenet: network id */
634  std::string mNetwork;
635 
636  /** Simplenet: address of my server incl port (localhost:40000)*/
638 
639  /** Simplenet: address for udp broadcast (255.255.255.255:40000*/
641 
642  /** Simplenet: effective address of my server port */
644 
645  /** Simplenet: list of nodes in this network incl default addresses*/
646  std::map<std::string,std::string> mNetworkNodes;
647 
648  /** Compiled data: map subscriptions */
649  std::map<std::string,EventSet> mInputSubscriptions;
650 
651  /** Background: mutex for below shared variables*/
652  faudes_mutex_t mMutex;
653 
654  /** Background: thread handle (global) */
655  faudes_thread_t mThreadListen;
656 
657  /** Background: request to join via flag (mutexed) */
659 
660  /** Background: server socket to listen (background only) */
662 
663  /** Background: udp broadcast socket (background only) */
665 
666  /** Background: state of a connection to a client (shared) */
667  typedef struct {
668  int mClientSocket; // the socket the client is connected to
669  EventSet mEvents; // events the client has subscribed to
670  bool mConnected; // set to true, if a subscription has been seen
671  std::string mLineBuffer; // buffer to receive one line
672  } ClientState;
673 
674  /** Background: map sockets to connection states (shared) */
675  std::map<int, ClientState> mOutputClientStates;
676 
677  /** Background: state of a connection to an event server (shared)*/
678  typedef struct {
679  SimplenetAddress mAddress; // actual IP address incl TCP port of remote server
680  SimplenetAddress mDefaultAddress; // default IP address incl TCP port of remote server
681  EventSet mEvents; // events we have subscribed to
682  int mServerSocket; // socket used to connect with provider
683  std::string mLineBuffer; // buffer to receive one line
684  } ServerState;
685 
686  /** Background: connection states to event servers (by node name)*/
687  std::map<std::string,ServerState> mInputServerStates;
688 
689 
690 
691 }; // end class nDevice
692 
693 // declare background threads
694 void* NDeviceListen(void*);
695 
696 #endif // configured for simplenet
697 
698 
699 
700 } // namespace faudes
701 
702 #endif // include
#define FAUDES_API
Interface export/import symbols: windows.
Definition: cfl_platform.h:81
#define FAUDES_TYPE_DECLARATION(ftype, ctype, cbase)
faudes type declaration macro
Definition: cfl_types.h:867
Attribute for the configuration of a input or output mapping.
Definition: iop_vdevice.h:68
virtual void Clear(void)
Clear.
Definition: iop_vdevice.cpp:82
void DoAssign(const AttributeDeviceEvent &rSrcAttr)
Assignment.
Definition: iop_vdevice.cpp:90
Configuration of a networked input or output.
const AttributeSimplenetOutput * Outputp(void) const
Get output mapping.
virtual void Clear(void)
Clear.
const AttributeSimplenetInput * Inputp(void) const
Get input mapping.
void DoAssign(const AttributeSimplenetEvent &rSrc)
DoAssign.
virtual bool IsDefault(void) const
Test for default value (never)
Configuration of a network input mapping.
virtual bool IsDefault(void) const
Test for default value (always, since we have no data)
void DoAssign(const AttributeSimplenetInput &rSrcAttr)
Copy method.
virtual void Clear(void)
Clear to default.
AttributeSimplenetInput(void)
Default constructor (no triggers)
Configuration of a network output mapping.
Definition: iop_simplenet.h:96
virtual void Clear(void)
Clear to default.
AttributeSimplenetOutput(void)
Default constructor.
virtual bool IsDefault(void) const
Test for default value (always, since we have no data)
void DoAssign(const AttributeSimplenetOutput &rSrcAttr)
Copy method.
Minimal Attribute.
Set of indices with symbolic names.
Definition: cfl_nameset.h:69
Simplenet node address.
Definition: iop_simplenet.h:31
int Port(void) const
Get TCP port.
Definition: iop_simplenet.h:51
void Ip(std::string ip)
Set IP address.
Definition: iop_simplenet.h:57
std::string mIp
Ip address.
Definition: iop_simplenet.h:71
std::string Ip(void) const
Get IP address.
Definition: iop_simplenet.h:48
void Port(int port)
Set TCP port
Definition: iop_simplenet.h:60
Set of indices with symbolic names and attributes.
Definition: cfl_nameset.h:564
A TokenReader reads sequential tokens from a file or string.
A TokenWriter writes sequential tokens to a file, a string or stdout.
Base class of all libFAUDES objects that participate in the run-time interface.
Definition: cfl_types.h:239
An nDevice implements networked IO via a simple TCP/IP protocol.
friend void * NDeviceServer(void *)
SimplenetAddress mListenAddress
Simplenet: address of my server incl port (localhost:40000)
TaNameSet< AttributeSimplenetEvent > * pConfiguration
Overall configuration (with actual type)
std::string mNetwork
Simplenet: network id.
std::map< std::string, EventSet > mInputSubscriptions
Compiled data: map subscriptions.
faudes_thread_t mThreadListen
Background: thread handle (global)
std::map< std::string, ServerState > mInputServerStates
Background: connection states to event servers (by node name)
int mBroadcastSocket
Background: udp broadcast socket (background only)
std::map< int, ClientState > mOutputClientStates
Background: map sockets to connection states (shared)
faudes_mutex_t mMutex
Background: mutex for below shared variables.
SimplenetAddress mEffectiveListenAddress
Simplenet: effective address of my server port.
friend void * NDeviceReply(void *)
SimplenetAddress mBroadcastAddress
Simplenet: address for udp broadcast (255.255.255.255:40000.
bool mStopListen
Background: request to join via flag (mutexed)
std::map< std::string, std::string > mNetworkNodes
Simplenet: list of nodes in this network incl default addresses.
int mListenSocket
Background: server socket to listen (background only)
Virtual base class to define the interface for event io.
Definition: iop_vdevice.h:261
Includes all libFAUDES headers, no plugins.
Virtual device for interface definition
libFAUDES resides within the namespace faudes.
uint32_t Idx
Type definition for index type (allways 32bit)
void * NDeviceListen(void *arg)
Background: state of a connection to a client (shared)
Background: state of a connection to an event server (shared)
SimplenetAddress mDefaultAddress

libFAUDES 2.32b --- 2024.03.01 --- c++ api documentaion by doxygen