![]() |
MAK RTIspy API Documentation for HLA Evolved
|
00001 /******************************************************************************* 00002 ** Copyright (c) 2005 MaK Technologies, Inc. 00003 ** All rights reserved. 00004 *******************************************************************************/ 00005 /******************************************************************************* 00006 ** $RCSfile: inOutForwarderPort.h,v $ $Revision: 1.18 $ $State: Exp $ 00007 *******************************************************************************/ 00010 00011 #ifndef DtInOutForwarderPort_H_ 00012 #define DtInOutForwarderPort_H_ 00013 00014 #include "forwarderPort.h" 00015 #include "routeMap.h" 00016 #include "rtiMsConfig.h" 00017 #include "peerToPeerSockMgr.h" 00018 #include <vlutil/vlTime.h> 00019 #include <udpMsgSocket.h> 00020 #include <map> 00021 00022 class DtRIDParameters; 00023 class DtRouteMap; 00024 class DtTcpSocketMgr__vl__; 00025 class DtForwarderNodeInfoMsg; 00026 class DtMacAddrMsg; 00027 00032 class DT_DLL_FORWARDER DtInOutForwarderPort : public DtForwarderPort 00033 { 00034 00035 protected: 00036 00038 DtInOutForwarderPort( const DtRIDParameters* params, 00039 DtBoost::shared_ptr<DtRouteMap> routes, 00040 const MAKRti::DtInetAddr& host, 00041 int forwarderPort, 00042 const MAKRti::DtInetAddr& forwarderAddrToConnectTo ); 00043 00044 public: 00045 00046 virtual ~DtInOutForwarderPort(); 00047 00049 virtual bool isReady() const; 00050 00052 virtual DtAddressMsgPair getNextMsg(); 00053 00055 virtual bool getInitializationMsgs( DtForwarderPort::DtSocketSet& socks, 00056 std::list<DtAddressMsgPair>& msgs, bool printBeDestMetadata); 00057 00059 virtual bool getInitializationMsg( DtMsgSocket* sock, 00060 DtAddressMsgPair& msg, bool printBeDestMetadata); 00061 00063 virtual void sendByTransport( const DtForwarderMsg& msg ) const; 00064 00066 virtual void sendToAllReliable( const DtForwarderMsg& msg ) const; 00067 00070 virtual void sendToListReliable( const DtForwarderMsg& msg, 00071 const DtAddressPortList& destinations ) const; 00072 00074 virtual void selectParams( MAKRti::DtSelectParamWithWrite& selectParams ); 00075 00077 virtual void updateRoutes(); 00078 00079 // Retrieve and process initialization messages if necessary. 00080 virtual void processInitializationMessages(); 00081 00084 virtual int checkConnectionStatus( const DtInetAddrAndPort* target = 0 ); 00085 00087 virtual void clearNeededConnections(); 00088 00090 virtual unsigned int abortPendingConnections(); 00091 00093 virtual unsigned int pendingConnectionsAborted(); 00094 00096 virtual DtAddressPortList connections() const; 00097 00099 virtual void listenToMulticastGroup( const MAKRti::DtInetAddr& mcastAddr ){}; 00100 virtual void dropMulticastGroup( const MAKRti::DtInetAddr& mcastAddr ){}; 00101 00103 virtual bool updateFederateConnectionId( unsigned long orig, 00104 unsigned long final ); 00105 00107 virtual bool flush(); 00108 00110 virtual bool flushOnly(); 00111 00113 virtual MAKRti::DtString connectionListToString( const char* separator = " : " ) const; 00114 00115 virtual bool populateConnectionInformation( 00116 unsigned int& numForwarderToForwarderConns, 00117 std::vector<MAKRti::DtString>& forwarderIdentifiers, 00118 std::vector<MAKRti::DtString>& forwarderConnectionHostNames, 00119 std::vector<DtInetAddrAndPort>& forwarderConnectionAddrs) const; 00120 00121 public: 00122 00124 static DtForwarderPort* create( const DtRIDParameters* params, 00125 const DtBoost::shared_ptr<DtRouteMap> routes, 00126 const MAKRti::DtInetAddr& host, int forwarderPort, 00127 const MAKRti::DtInetAddr& additionalForwarderToConnectTo ); 00128 00132 static void setCreatorFunction( DtForwarderPortCreatorFcn creator ); 00133 00134 00136 static void socketAdditionCb( DtTcpMsgSocket* sock, void* usr ); 00137 virtual void socketAdditionCb( DtTcpMsgSocket* sock ); 00138 00140 virtual void sendMacAddrMsg( DtTcpMsgSocket* sock ); 00141 00143 virtual void sendPortMsg( DtTcpMsgSocket* sock ); 00144 00146 static void socketEstablishedCb( DtTcpMsgSocket* sock, void* usr ); 00147 virtual void socketEstablishedCb( DtTcpMsgSocket* sock ); 00148 00150 static void socketRemovalCb( DtTcpMsgSocket* sock, void* usr ); 00151 virtual void socketRemovalCb( DtTcpMsgSocket* sock ); 00152 00153 virtual void processForwarderNodeInfoMsg(const DtForwarderPort::DtAddressMsgPair& msg); 00154 virtual void processMacAddrMsg(const DtForwarderPort::DtAddressMsgPair& msg); 00155 00158 virtual void processPortMsg(const DtForwarderPort::DtAddressMsgPair& msgPair); 00159 00160 void sendForwarderNodeInfoMsg( DtTcpMsgSocket* sock ); 00161 void sendForwarderNodeInfoMsg(); 00162 00163 protected: 00164 00166 virtual void initializeConnections(); 00167 00169 virtual bool connectToPeer( const DtInetAddrAndPort& addrToConnectTo ); 00170 00172 virtual int processLostConnection( DtTcpMsgSocket* sock ); 00173 00176 void connectionCompleted( const DtInetAddrAndPort& addrAndPort, 00177 DtTcpMsgSocket* sock ); 00178 00179 00181 void addSocketUsingRoutesFile(DtTcpMsgSocket* sock, 00182 const DtInetAddrAndPort& addrAndPort); 00183 00186 bool addSocketDynamically(DtTcpMsgSocket* sock); 00187 00188 //Store / remove connection and update dependencies. 00189 void addConnection( const DtInetAddrAndPort& newConn, DtTcpMsgSocket* sock ); 00190 void removeConnection( DtAddrToConnMap::iterator pos ); 00191 00192 protected: 00193 00195 DtInOutForwarderPort(); 00196 DtInOutForwarderPort( const DtInOutForwarderPort& orig ); 00197 DtInOutForwarderPort& operator=( const DtInOutForwarderPort& orig ); 00198 00200 bool removeFromPendingList( DtTcpMsgSocket* addr ); 00201 00203 void becomeRootForwarderNode(); 00204 00205 protected: 00206 00207 00208 bool myIsReady; 00209 DtPeerToPeerTcpSockMgr* myConnectionMgr; 00210 DtForwarderPort::DtAddrToConnMap myConnections; 00211 DtForwarderPort::DtAddrToConnMap::const_iterator myNextConnection; 00212 DtForwarderPort::DtAddrToConnMap::const_iterator myLastConnection; 00213 00214 std::map<DtInetAddrAndPort, DtTcpMsgSocket*> myAddrToSockMap; 00215 00217 DtForwarderPort::DtSocketSet myPendingConnections; 00218 DtForwarderPort::DtSocketSet myPrePendingConnections; 00219 DtForwarderPort::DtSocketSet myPostPendingConnections; 00220 DtForwarderPort::DtSocketSet myUnknownPortConnections; 00221 00223 std::map<DtInetAddrAndPort, DtString> myNeededConnections; 00224 00226 std::map<DtInetAddrAndPort, DtString> myStillNeededConnections; 00227 00230 std::map<DtInetAddrAndPort, DtInetAddrAndPort> myUsedToListeningMap; 00231 00232 00233 DtForwarderPort::DtSocketList myInitiatedConnections; 00234 DtForwarderPort::DtSocketSet myExpiredConnections; 00235 DtForwarderPort::DtSocketSet myDiscardedRemoteSockets; 00236 00237 DtUdpMsgSocket* myLegacyUdpConnection; 00238 std::map<DtInetAddrAndPort, unsigned long long> myMacAddrsOfConnectedForwardersMap; 00239 bool myIsRootForwarderNode; 00240 00241 MAKRti::DtClock myClock; 00242 mutable std::map< DtTcpMsgSocket*, MAKRti::DtTime > mySktSendTimeMap; 00243 00245 MAKRti::DtInetDevice myHostIf; 00246 00247 int myCompressionLevel; 00248 00249 protected: 00250 00251 static DtForwarderPortCreatorFcn theCreator; 00252 00253 }; 00254 00255 inline bool DtInOutForwarderPort::updateFederateConnectionId( unsigned long orig, 00256 unsigned long final ) 00257 { 00259 return false; 00260 } 00261 00262 #endif //! DtInOutForwarderPort_H_ 00263