|
|
Go to the documentation of this file.
53 if( mPort<=0) return false;
54 if( mIp== "") return false;
55 if( mIp.find( ':',0)!=std::string::npos) return false;
62 if(! Valid()) return res;
69 FD_DHV( "SimplenetAddress::IpColonPort(): " << ipcolonport << " --> ?");
74 std::size_t cpos = ipcolonport.find( ':',0);
75 if(cpos==std::string::npos) return;
77 if(cpos+1>= ipcolonport.length()) return;
79 mIp=ipcolonport.substr(0,cpos);
83 FD_DHV( "SimplenetAddress::IpColonPort(): " << ipcolonport << " --> " << IpColonPort());
93 if(this-> mIp < rOther. mIp) return true;
94 if(this-> mIp > rOther. mIp) return false;
101#ifdef FAUDES_IODEVICE_SIMPLENET
121 (void) rLabel; (void) pContext;
127 (void) rLabel; (void) pContext;
129 FD_DHV( "AttributeSimplenetOutput(" << this << ")::DoRead(tr)");
161 (void) rLabel; (void) pContext;
167 (void) rLabel; (void) pContext;
169 FD_DHV( "AttributeSimplenetInput(" << this << ")::DoRead(tr)");
203 FD_DHV( "AttributeSimplenetEvent::AttributeSimplenetEvent(" << this << ")");;
204 pOutputPrototype=OutputPrototypep();
205 pInputPrototype=InputPrototypep();
212 FD_DHV( "AttributeSimplenetEvent(" << this << "): form other attr " << &rOtherAttr);
248int syncSend( int dest, const char* data, int len, int flag) {
252 int rc=send(dest, data+from, left, 0);
254 std::stringstream errstr;
255 errstr << "Simplenet fatal network error (cannot send message)";
256 throw Exception( "nDevice::syncSend", errstr.str(), 553, true);
266 FD_DHV( "nDevice(" << this << ")::nDevice()");
272 mName= "SimplenetNode";
277 faudes_mutex_init(& mMutex);
284 FD_DHV( "nDevice(" << this << ")::~nDevice()");
288 faudes_mutex_destroy(& mMutex);
293 FD_DHV( "nDevice(" << this << ")::Clear()");
360 FD_DHV( "nDevice(" << this << ")::Compile()");
368 FD_DHV( "nDevice::DoWrite()");
386 std::map<std::string,std::string>::const_iterator nit;
391 if(defaddress. Valid())
400 FD_DHV( "nDevice::DoReadPreface()");
410 std::stringstream errstr;
411 errstr << "Simplenet address expected at " << rTr. FileLine();
412 throw Exception( "nDevice::DoRead", errstr.str(), 50);
417 while(!rTr. Eos( "Network")) {
429 std::stringstream errstr;
430 errstr << "Simplenet address expected at " << rTr. FileLine();
431 throw Exception( "nDevice::DoRead", errstr.str(), 50);
437 if(token. IsBegin( "BroadcastAddress")) {
441 std::stringstream errstr;
442 errstr << "Simplenet address expected at " << rTr. FileLine();
443 throw Exception( "nDevice::DoRead", errstr.str(), 50);
445 rTr. ReadEnd( "BroadcastAddress");
452 while(!rTr. Eos( "Network")) {
455 std::stringstream errstr;
456 errstr << "Simplenet node name expected at " << rTr. FileLine();
457 throw Exception( "nDevice::DoRead", errstr.str(), 50);
465 if(!defaddress. Valid()) {
466 std::stringstream errstr;
467 errstr << "Simplenet node address expected at " << rTr. FileLine();
468 throw Exception( "nDevice::DoRead", errstr.str(), 50);
479#define LOCK_E {int rc = faudes_mutex_lock(&mMutex); \
480 if(rc) {FD_ERR("nDevice::LOCK_E: lock mutex error\n"); exit(1); }}
481#define UNLOCK_E {int rc = faudes_mutex_unlock(&mMutex); \
482 if(rc) {FD_ERR("nDevice::LOCK_E: unlock mutex error\n"); exit(1); }}
483#define TLOCK_E {int rc = faudes_mutex_lock(&ndevice->mMutex); \
484 if(rc) {FD_ERR("nDevice::TLOCK_E: lock mutex error\n"); exit(1); }}
485#define TUNLOCK_E {int rc = faudes_mutex_unlock(&ndevice->mMutex); \
486 if(rc) {FD_ERR("nDevice::TLOCK_E: unlock mutex error\n"); exit(1); }}
499 std::stringstream errstr;
500 errstr << "Unknown output event " << output;
501 throw Exception( "nDevice::WriteOutput", errstr.str(), 65);
507 std::stringstream errstr;
508 errstr << "Invalid output attribute " << output;
509 throw Exception( "nDevice::WriteOutput", errstr.str(), 65);
514 FD_DHV( "nDevice::WriteOutput(): message: " << message.substr(0,message.length()-1));
522 if(!sit->second.mEvents.Empty())
523 if(!sit->second.mEvents.Exists(output))
525 clientsock=sit->second.mClientSocket;
527 FD_DHV( "nDevice::WriteOutput(): to socket " << clientsock);
528 syncSend(clientsock, message.c_str(), message.length(), 0);
532 FD_DH( "nDevice::WriteOutput(): failed to notify client on socket " << clientsock);
535 FD_DHV( "nDevice::WriteOutput(): done");
549 std::map<std::string,std::string>::iterator nit;
551 if(nit->first == mName) continue;
561 int hostname_len =1023;
562 if(gethostname(hostname,hostname_len)!=0) {
563 std::stringstream errstr;
564 errstr << "Simplenet fatal network error (cannot get hostname)";
565 throw Exception( "nDevice::Start", errstr.str(), 553);
567 hostname[hostname_len]=0;
574 std::stringstream errstr;
575 errstr << "Simplenet fatal network error (cannot open server socket)";
576 throw Exception( "nDevice::Start", errstr.str(), 553);
579 faudes_setsockopt( mListenSocket,SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
581 struct sockaddr_in serveraddr;
582 memset(&serveraddr, 0, sizeof(serveraddr));
583 serveraddr.sin_family = AF_INET;
584 serveraddr.sin_addr.s_addr = htonl(INADDR_ANY);
587 if(bind( mListenSocket, ( struct sockaddr *) &serveraddr, sizeof(serveraddr)) <0) {
588 std::stringstream errstr;
589 errstr << "Simplenet fatal network error (cannot bind socket)";
590 throw Exception( "nDevice::Start", errstr.str(), 553);
594 std::stringstream errstr;
595 errstr << "Simplenet fatal network error (cannot listen from socket)";
596 throw Exception( "nDevice::Start", errstr.str(), 553);
601 std::stringstream errstr;
602 errstr << "Simplenet fatal network error (cannot open broadcast socket)";
603 throw Exception( "nDevice::Start", errstr.str(), 553);
606 faudes_setsockopt( mBroadcastSocket,SOL_SOCKET, SO_REUSEADDR, &reuse, sizeof(reuse));
607 faudes_setsockopt( mBroadcastSocket,SOL_SOCKET, SO_REUSEPORT, &reuse, sizeof(reuse));
610 if(faudes_setsockopt( mBroadcastSocket, SOL_SOCKET, SO_BROADCAST, &reuse, sizeof(reuse)) ) {
611 std::stringstream errstr;
612 errstr << "Simplenet fatal network error (cannot setopt broadcast socket)";
613 throw Exception( "nDevice::Start", errstr.str(), 553);
616 struct sockaddr_in broadcastaddr;
617 memset(&broadcastaddr, 0, sizeof(broadcastaddr));
618 broadcastaddr.sin_family = AF_INET;
619 broadcastaddr.sin_addr.s_addr = htonl(INADDR_ANY);
622 if(bind( mBroadcastSocket, ( struct sockaddr *) &broadcastaddr, sizeof(broadcastaddr)) <0) {
623 std::stringstream errstr;
624 errstr << "Simplenet fatal network error (cannot bind broadcast socket)";
625 throw Exception( "nDevice::Start", errstr.str(), 553);
632 std::stringstream errstr;
633 errstr << "Simplenet fatal thread error (cannot create thread)";
634 throw Exception( "nDevice::Start", errstr.str(), 554);
642 FD_DH( "nDevice::Stop()");
648 std::string message= "<Stop> " + mNetwork + " " + mName + " </Stop>\n";
649 struct sockaddr_in broadcastaddr;
650 memset(&broadcastaddr, '\0', sizeof(broadcastaddr));
651 broadcastaddr.sin_family=AF_INET;
656 ( struct sockaddr *) & broadcastaddr, sizeof(broadcastaddr));
659 FD_DH( "nDevice::Stop(): waiting for listen thread");
661 FD_DH( "nDevice::Stop(): listen thread finished");
684 std::map<std::string,nDevice::ServerState>::iterator sit;
685 std::map<int,nDevice::ClientState>::iterator cit;
689 FD_DH( "nDevice::Listen(" << ndevice << ")");
691 faudes_systime_t lastbroadcast;
692 lastbroadcast.tv_sec=0;
693 lastbroadcast.tv_nsec=0;
694#ifdef FAUDES_DEBUG_IODEVICE
707 if(!sit->second.mAddress.Valid()) {
708 FD_DH( "nDevice::Listen(): missing server address for node: " << sit->first);
714 if(sit->second.mServerSocket<=0) {
715 FD_DH( "nDevice::Listen(): missing server connection for node: " << sit->first);
724 if(cit->second.mClientSocket<0) continue;
725 if(cit->second.mConnected) clientmis--;
727#ifdef FAUDES_DEBUG_IODEVICE
728 if(clientmis!=servermis)
729 FD_DH( "nDevice::Listen(): missing clients to subscribe: #"<< clientmis);
748 faudes_systime_t now;
749 faudes_gettimeofday(&now);
750 faudes_mstime_t diffms;
754 std::string message= "<Request> "
755 + ndevice-> mNetwork + " " + ndevice-> mName + " </Request>\n";
757 struct sockaddr_in broadcastaddr;
758 memset(&broadcastaddr, '\0', sizeof(broadcastaddr));
759 broadcastaddr.sin_family=AF_INET;
764 0,( struct sockaddr *) & broadcastaddr, sizeof(broadcastaddr));
766 FD_DH( "nDevice::Listen(): broadcast request: " << message.substr(0,message.length()-1) << " #" << rc);
768 faudes_gettimeofday(&lastbroadcast);
775 if(sit->second.mServerSocket>0) continue;
777 if(!sit->second.mAddress.Valid()) continue;
779 FD_DH( "nDevice::Listen(): subscribing to " << sit->first <<
780 " at " << sit->second.mAddress.IpColonPort());
782 int serversock = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
784 FD_DH( "nDevice::Listen(): subscription failed: no socket");
788 unsigned long int serverinaddr = INADDR_NONE;
789 if(serverinaddr==INADDR_NONE) {
790 FD_DH( "nDevice::Listen(): using address as advertised");
791 serverinaddr = inet_addr(sit->second.mAddress.Ip().c_str());
793 if(serverinaddr==INADDR_NONE) {
794 struct hostent *host;
795 host = gethostbyname(sit->second.mAddress.Ip().c_str());
797 FD_DH( "nDevice::Listen(): using address by name lookup");
798 serverinaddr = *( unsigned long int*) host->h_addr;
801 if(serverinaddr==INADDR_NONE) {
802 FD_DH( "nDevice::Listen(): subscription failed: invalid address " << sit->second.mAddress.Ip());
803 faudes_closesocket(serversock);
807 struct sockaddr_in serveraddress;
808 memset(&serveraddress, 0, sizeof(serveraddress));
809 serveraddress.sin_family = AF_INET;
810 serveraddress.sin_addr.s_addr=serverinaddr;
811 serveraddress.sin_port = htons(sit->second.mAddress.Port());
813 if(connect(serversock, ( struct sockaddr*) &serveraddress, sizeof(serveraddress))<0) {
814 FD_DH( "nDevice::Listen(): subscription failed: connect");
815 faudes_closesocket(serversock);
821 hello= "% Simplenet universal event subscription: "+ndevice-> mName+ " subscribing from "+sit->first+ "\n";
822 syncSend(serversock, hello.c_str(), hello.length(), 0);
823 hello= "% Expecting notifications in format '<Notify> event_name </Notify>'\n";
824 syncSend(serversock, hello.c_str(), hello.length(), 0);
825 hello= "% Trying to subscribe to all required events\n";
826 syncSend(serversock, hello.c_str(), hello.length(), 0);
828 faudes_closesocket(serversock);
832 FD_DH( "nDevice::Listen(): subscription failed: cannot write");
833 faudes_closesocket(serversock);
837 FD_DH( "nDevice::Listen(): subscribing to " << sit->first << " via socket " << serversock);
838 sit->second.mServerSocket=serversock;
841 sevents. Name( "Subscribe");
842 std::string message=sevents. ToString() + "\n";
843 syncSend(serversock,message.c_str(), message.length(),0);
850 FD_DH( "nDevice::Listen(): subscribing to " << sit->first << " via socket " << serversock << ": ok");
859 if(mysocks_max<ndevice->mListenSocket) mysocks_max=ndevice-> mListenSocket;
860 if(mysocks_max>= FD_SETSIZE) FD_ERR( "NDeviceListen: fail to select socket " << mysocks_max);
863 if(mysocks_max< ndevice->mBroadcastSocket) mysocks_max=ndevice-> mBroadcastSocket;
864 if(mysocks_max>= FD_SETSIZE) FD_ERR( "NDeviceListen: fail to select socket " << mysocks_max);
868 int serversock=sit->second.mServerSocket;
869 if(serversock<0) continue;
870 if(mysocks_max< serversock) mysocks_max=serversock;
871 if(mysocks_max>= FD_SETSIZE) FD_ERR( "NDeviceListen: fail to select socket " << mysocks_max);
872 FD_SET(serversock, &mysocks);
876 int clientsock=cit->second.mClientSocket;
877 if(clientsock<0) continue;
878 if(mysocks_max< clientsock) mysocks_max=clientsock;
879 if(mysocks_max>= FD_SETSIZE) FD_ERR( "NDeviceListen: fail to select socket " << mysocks_max);
880 FD_SET(clientsock, &mysocks);
887 int avail=select(mysocks_max+1, &mysocks, NULL, NULL, &tv);
896 #ifdef FAUDES_DEBUG_IODEVICE
898 if((debuglisten>10) || (avail>0)) {
899 FD_DH( "nDevice::Listen(): listen as node \"" << ndevice-> mName << "\" on network \"" << ndevice-> mNetwork << "\"" << " #" << avail);
909 struct sockaddr_in clientaddr;
910 socklen_t clientaddr_len = sizeof(clientaddr);
911 clientsock=accept(ndevice-> mListenSocket, ( struct sockaddr *) &clientaddr, &clientaddr_len );
913 FD_DH( "nDevice::Listen(): failed to accept incomming connection");
916 FD_DH( "nDevice::Listen(): accepted connection from client " << inet_ntoa(clientaddr.sin_addr) <<
917 " on socket " << clientsock);
921 hello= "% Simplenet Event Server: "+ndevice-> mName+ " providing events\n";
922 syncSend(clientsock, hello.c_str(), hello.length(), 0);
923 hello= "% Notifications will have format '<Notify> event_name </Notify>'\n";
924 syncSend(clientsock, hello.c_str(), hello.length(), 0);
925 hello= "% Commands are accepted in format '<Cmd> cmd_name </Cmd>'\n";
926 syncSend(clientsock, hello.c_str(), hello.length(), 0);
927 hello= "% Supported commands are Subscribe, Info, Status, and ResetRequest\n";
928 syncSend(clientsock, hello.c_str(), hello.length(), 0);
930 faudes_closesocket(clientsock);
934 FD_DH( "nDevice::Listen(): connection test failed: cannot write");
935 faudes_closesocket(clientsock);
955 struct sockaddr_in fromaddr;
956 socklen_t fromaddr_len = sizeof(fromaddr);
957 data_len=recvfrom(ndevice-> mBroadcastSocket,data,data_len,0, ( struct sockaddr*) &fromaddr,&fromaddr_len);
958 if(data_len<0) data_len=0;
960 if(data_len>=1) if(data[data_len-1]== '\n') data[data_len-1]=0;
961 FD_DH( "nDevice::Listen(): received udp datagram " << data <<
962 " from " << inet_ntoa(fromaddr.sin_addr));
980 if(sit->second.mServerSocket==-1) {
981 lastbroadcast.tv_sec=0;
982 lastbroadcast.tv_nsec=0;
986 if(snode!=ndevice-> mName) {
988 std::string message= "<Advert> "
990 + ndevice-> mName + " " +
993 struct sockaddr_in replyaddr;
994 memset(&replyaddr, '\0', sizeof(replyaddr));
995 replyaddr.sin_family=AF_INET;
1001 int rc = sendto(ndevice-> mBroadcastSocket,message.c_str(),message.length(),0,( struct sockaddr *) & replyaddr, sizeof(replyaddr));
1003 FD_DH( "nDevice::Listen(): reply advert: " << message.substr(0,message.length()-1) << " #" << rc);
1005 FD_DH( "nDevice::Listen(): ingoring request from myself");
1008 FD_DH( "nDevice::Listen(): ingoring request from other network");
1018 addr. Ip(inet_ntoa(fromaddr.sin_addr));
1019 FD_DHV( "nDevice::Listen(): figure actual ip address " << addr. Ip());
1022 FD_DH( "nDevice::Listen(): fallback to explicit ip address " << addr. Ip());
1024 std::map<std::string,nDevice::ServerState>::iterator sit;
1027 FD_DH( "nDevice::Listen(): ignoring irrelevant advert from " << node);
1028 } else if(sit->second.mAddress.Valid()) {
1029 FD_DH( "nDevice::Listen(): ignoring address overwrite (hardwired?) " << node);
1032 if(!sit->second.mAddress.Valid()) {
1033 FD_DH( "nDevice::Listen(): accept advert " << node);
1034 sit->second.mAddress=addr;
1035 if(sit->second.mServerSocket>=0) faudes_closesocket(sit->second.mServerSocket);
1036 sit->second.mServerSocket=-1;
1039 FD_DH( "nDevice::Listen(): ingoring advert from other network");
1043 FD_DH( "nDevice::Listen(): ignore invalid udp message");
1052 int serversock=sit->second.mServerSocket;
1053 if(serversock<0) continue;
1054 if(FD_ISSET(serversock, &mysocks)) {
1056 FD_DH( "nDevice::Listen(): reading sock " << serversock);
1059 int count = recv(serversock, buffer, 1024, 0);
1061 FD_DH( "nDevice::Listen(): reading server sock " << serversock << " : eof");
1062 faudes_closesocket(serversock);
1063 sit->second.mServerSocket=-1;
1066 FD_DH( "nDevice::Listen(): reading server sock " << serversock << ": #" << count);
1068 sit->second.mLineBuffer +=std::string(buffer);
1071 if(buffer[count-1]== '\n')
1072 if(sit->second.mLineBuffer.length()>0)
1074 const std::string& linebuffer = sit->second.mLineBuffer;
1075#ifdef FAUDES_DEBUG_IODEVICE
1076 if(linebuffer.length()>0)
1077 if(linebuffer[0]!= '%')
1078 FD_DH( "nDevice::Listen(): reading server sock " << serversock << ": line: " << linebuffer);
1084 while(tr. Peek(token)) {
1091 FD_DH( "nDevice::Listen(): found event " << event);
1100 FD_DH( "nDevice::Listen(): found device info");
1121 while(!tr. Eos(section)) tr. Get(token);
1126 FD_DH( "nDevice::Listen(): error: ignore token");
1130 FD_DH( "nDevice::Listen(): " << serversock << ": invalid notification");
1132 sit->second.mLineBuffer.clear();
1140 int clientsock=cit->second.mClientSocket;
1141 if(clientsock<0) continue;
1142 if(FD_ISSET(clientsock, &mysocks)) {
1144 FD_DH( "nDevice::Listen(): reading client sock " << clientsock);
1147 int count = recv(clientsock, buffer, 1024, 0);
1149 FD_DH( "nDevice::Listen(): reading client sock " << clientsock << " : eof");
1151 faudes_closesocket(clientsock);
1152 cit->second.mClientSocket=-1;
1153 cit->second.mConnected= false;
1157 FD_DH( "nDevice::Listen(): reading client sock " << clientsock << ": #" << count);
1159 cit->second.mLineBuffer +=std::string(buffer);
1162 if(buffer[count-1]== '\n')
1163 if(cit->second.mLineBuffer.length()>0)
1165 const std::string& linebuffer = cit->second.mLineBuffer;
1166#ifdef FAUDES_DEBUG_IODEVICE
1167 if(linebuffer.length()>0)
1168 if(linebuffer[0]!= '%')
1169 FD_DH( "nDevice::Listen(): reading client sock " << clientsock << ": line: " << linebuffer);
1175 while(tr. Peek(token)) {
1181 std::string response= "<NAck> </NAck>\n";
1182 FD_DH( "nDevice::Reply(" << clientsock << "): received cmd " << cmd);
1186 response=ndevice-> ToString() + "\n";
1198 if(cmd== "ResetRequest") {
1199 FD_DH( "nDevice::Reply(" << clientsock << "): reset request");
1207 syncSend(clientsock, response.c_str(), response.length(), 0);
1210 if(token. IsBegin( "Subscribe")) {
1212 sevents. Read(tr, "Subscribe");
1214 sevents. Name( "Subscribed");
1215 FD_DH( "nDevice::Reply(" << clientsock << "): providing events " << sevents. ToString());
1217 cit->second.mEvents.Clear();
1218 cit->second.mEvents.InsertSet(sevents);
1219 cit->second.mConnected= true;
1220 std::string response=sevents. ToString()+ "\n";
1223 syncSend(clientsock, response.c_str(), response.length(), 0);
1227 FD_DH( "nDevice::Reply(" << clientsock << "): invalid cmd");
1229 cit->second.mLineBuffer.clear();
1236 FD_DH( "nDevice::Listen(): broadcast condition");
1248 FD_DH( "nDevice::Listen(): select error");
1254 FD_DH( "nDevice::Listen(): close client sockets");
1257 int clientsock= cit->second.mClientSocket;
1258 if(clientsock>0) faudes_closesocket(clientsock);
1259 cit->second.mClientSocket=-1;
1260 cit->second.mConnected= false;
1265 FD_DH( "nDevice::Listen(): close server sockets");
1267 int serversock=sit->second.mServerSocket;
1268 if(serversock>0) faudes_closesocket(serversock);
1269 sit->second.mServerSocket=-1;
1271 FD_DH( "nDevice::Listen(): terminating listen thread");
1272 faudes_thread_exit(NULL);
1286 std::string message= "<Cmd> ResetRequest </Cmd>\n";
1291 int serversock=sit->second.mServerSocket;
1292 if(serversock<0) continue;
1293 FD_DH( "nDevice::Reset(): sending reset request to socket " << serversock);
1294 syncSend(serversock, message.c_str(), message.length(), 0);
#define FAUDES_TYPE_IMPLEMENTATION(ftype, ctype, cbase)
const AttributeVoid * pOutputPrototype
const AttributeVoid * pInputPrototype
void DoAssign(const AttributeSimplenetEvent &rSrc)
AttributeSimplenetEvent(void)
static const AttributeSimplenetInput * InputPrototypep(void)
static const AttributeSimplenetOutput * OutputPrototypep(void)
virtual void DoRead(TokenReader &rTr, const std::string &rLabel="", const Type *pContext=0)
const std::string & Name(void) const
bool Exists(const Idx &rIndex) const
void SymbolicName(Idx index, const std::string &rName)
Idx Index(const std::string &rName) const
void RestrictSet(const NameSet &rOtherSet)
bool operator<(const SimplenetAddress &rOther) const
std::string IpColonPort(void) const
std::string Ip(void) const
std::string FileLine(void) const
bool Eos(const std::string &rLabel)
void ReadEnd(const std::string &rLabel)
std::string ReadString(void)
void ReadBegin(const std::string &rLabel)
void WriteEnd(const std::string &rLabel)
const std::string & StringValue(void) const
@ Begin <label> (begin of section)
bool IsString(void) const
bool ExistsAttributeString(const std::string &name)
void SetEmpty(const std::string &rName)
void SetBegin(const std::string &rName)
void InsAttributeString(const std::string &name, const std::string &value)
const std::string & AttributeStringValue(const std::string &name)
TokenType Type(void) const
void Read(const std::string &rFileName, const std::string &rLabel="", const Type *pContext=0)
std::string ToString(const std::string &rLabel="", const Type *pContext=0) const
void BroadcastAddress(const std::string &rAddr)
void InsNode(const std::string &rNodeName)
void ServerAddress(const std::string &rAddr)
virtual void Compile(void)
virtual void DoReadPreface(TokenReader &rTr, const std::string &rLabel="", const Type *pContext=0)
void InsNodeAddress(const std::string &rNode, const std::string &rAddress)
SimplenetAddress mListenAddress
TaNameSet< AttributeSimplenetEvent > * pConfiguration
std::map< std::string, EventSet > mInputSubscriptions
void NetworkName(const std::string &rNetwork)
faudes_thread_t mThreadListen
std::map< std::string, ServerState > mInputServerStates
void InsOutputEvent(const std::string &event)
virtual void DoWritePreface(TokenWriter &rTw, const std::string &rLabel="", const Type *pContext=0) const
std::map< int, ClientState > mOutputClientStates
SimplenetAddress mEffectiveListenAddress
friend void * NDeviceListen(void *)
virtual void WriteOutput(Idx output)
SimplenetAddress mBroadcastAddress
std::map< std::string, std::string > mNetworkNodes
void InsInputEvent(const std::string &event)
faudes_mutex_t * pBufferMutex
virtual const EventSet & Inputs(void) const
virtual void Compile(void)
std::string mDefaultLabel
faudes_cond_t * pWaitCondition
virtual void DoReadPreface(TokenReader &rTr, const std::string &rLabel="", const Type *pContext=0)
EventSet * mpConfiguration
virtual void DoWritePreface(TokenWriter &rTw, const std::string &rLabel="", const Type *pContext=0) const
faudes_mutex_t * pWaitMutex
std::deque< Idx > * pInputBuffer
virtual const EventSet & Outputs(void) const
void * NDeviceListen(void *arg)
Idx ToIdx(const std::string &rString)
AutoRegisterType< nDevice > gRtiRegisterSimplenetDevice("SimplenetDevice")
std::string ToStringInteger(Int number)
int syncSend(int dest, const char *data, int len, int flag)
libFAUDES 2.33k
--- 2025.09.16
--- c++ api documentaion by doxygen
|