![]() |
MAK RTIspy API Documentation for HLA 1.3
|
00001 /********************************************************************* 00002 ** Copyright (c) 2010 MaK Technologies, Inc. 00003 ** All rights reserved. 00004 *********************************************************************/ 00005 /********************************************************************* 00006 ** $RCSfile: $ $Revision: $ $State: Exp $ 00007 *********************************************************************/ 00008 00010 00011 #ifndef tcpMsgSocketMgr_H_ 00012 #define tcpMsgSocketMgr_H_ 00013 00014 #include <set> 00015 #include <vlutil/vlInetSocketMgr.h> 00016 #include "tcpMsgSocket.h" 00017 00018 using namespace MAKRti; 00019 00021 typedef void (*DtTcpSocketAdditionCallback)(DtTcpMsgSocket* sock, void* usr); 00022 typedef DtTcpSocketAdditionCallback DtTcpSocketRemovalCallback; 00023 00024 class DtTcpSocketMgrCbInfo 00025 { 00026 public: 00027 00028 DtTcpSocketMgrCbInfo(DtTcpSocketAdditionCallback cb, void* usr) 00029 { 00030 myCb = cb; 00031 myUsr = usr; 00032 } 00033 00034 bool operator==(const DtTcpSocketMgrCbInfo& rhs) 00035 { 00036 return (myCb == rhs.myCb && myUsr == rhs.myUsr); 00037 } 00038 00039 DtTcpSocketAdditionCallback myCb; 00040 void* myUsr; 00041 }; 00042 00043 typedef std::map<DtInetTcpSocket*, DtTcpMsgSocket*> DtTcpMsgSocketMap; 00044 00045 class DT_DLL_RTIUTIL DtTcpMsgSocketMgr 00046 { 00047 public: 00048 00050 DtTcpMsgSocketMgr(DtBoost::shared_ptr<DtMsgHeaderReader> hdrReader, 00051 size_t recvBufferSize = 20000, int maxQueuedMsgs = -1); 00052 00054 virtual ~DtTcpMsgSocketMgr(); 00055 00063 virtual bool openServerSocket( DtU16 localPort, DtInetDevice* hostIf = NULL, 00064 DtInetUtils::DtInetAddrFamily family = DtInetUtils::DtInetAddrFamily_IPv4, 00065 DtU32 flags = (DtDefaultSockOpts | DtSockOptNonBlocking) ); 00066 00071 virtual void processConnections(); 00072 00075 virtual void addSocket(DtTcpMsgSocket* sock); 00076 00078 static bool socketAdded(DtInetSocket* sock, void* usr); 00079 bool socketAdded(DtInetSocket* sock); 00080 00084 virtual void addSocketAdditionCallback(DtTcpSocketAdditionCallback cb, 00085 void* usr); 00086 virtual void removeSocketAdditionCallback(DtTcpSocketAdditionCallback cb, 00087 void* usr); 00089 00091 static bool socketRemoved(DtInetSocket* sock, void* usr); 00092 bool socketRemoved(DtInetSocket* sock); 00093 00097 virtual void addSocketRemovalCallback(DtTcpSocketRemovalCallback cb, 00098 void* usr); 00099 virtual void removeSocketRemovalCallback(DtTcpSocketRemovalCallback cb, 00100 void* usr); 00102 00104 virtual void removeAndDelete(DtTcpMsgSocket* sock); 00105 00107 virtual void enableBundling(size_t maxBundleSize); 00108 00110 virtual void disableBundling(); 00111 00113 virtual void enableCompression(DtU8 compressionLevel); 00114 00116 virtual void disableCompression(); 00117 00119 virtual void setTcpNoDelay(bool enable); 00120 00122 virtual void setSendBufferSize(DtU32 size); 00123 00125 virtual void setRecvBufferSize(DtU32 size); 00126 00128 virtual DtInetSockState serverSocketState() const; 00129 00131 virtual DtU32 maxMsgSize() const; 00132 00134 DtTcpMsgSocketMap& socketSet(); 00135 00138 DtTcpMsgSocketMap::iterator socketIter(DtTcpMsgSocket* sock); 00139 00141 DtString getLastError() const; 00142 00144 bool isListening() const { return serverSocketState() == DtInetSockState_LISTENING; } 00145 00146 private: 00147 00148 DtTcpMsgSocketMgr(const DtTcpMsgSocketMgr&); 00149 DtTcpMsgSocketMgr& operator=(const DtTcpMsgSocketMgr&); 00150 00151 protected: 00152 00154 std::auto_ptr<DtInetSocketMgr> mySocketMgr; 00155 00158 DtTcpMsgSocketMap mySockets; 00159 00161 DtBoost::shared_ptr<DtMsgHeaderReader> myHeaderReader; 00162 00164 int myMaxQueuedMessages; 00165 00167 size_t myRecvBufferSize; 00168 00170 bool myTcpNoDelay; 00171 00173 size_t myMaxBundleSize; 00174 00176 MAKRti::DtU8 myCompressionLevel; 00177 00179 MAKRti::DtU32 mySockRecvBufferSize; 00180 00182 MAKRti::DtU32 mySockSendBufferSize; 00183 00185 std::list<DtTcpSocketMgrCbInfo> myAdditionCallbacks; 00186 00188 std::list<DtTcpSocketMgrCbInfo> myRemovalCallbacks; 00189 00191 DtString myLastError; 00192 }; 00193 00194 inline DtTcpMsgSocketMap& DtTcpMsgSocketMgr::socketSet() 00195 { 00196 return mySockets; 00197 } 00198 00199 inline DtTcpMsgSocketMap::iterator DtTcpMsgSocketMgr::socketIter(DtTcpMsgSocket* sock) 00200 { 00201 DtTcpMsgSocketMap::iterator iter = mySockets.end(); 00202 if(sock) 00203 { 00204 DtInetTcpSocket* inetSock = sock->inetTcpSocket(); 00205 if(inetSock) 00206 { 00207 iter = mySockets.find(inetSock); 00208 } 00209 } 00210 return iter; 00211 } 00212 00213 inline DtString DtTcpMsgSocketMgr::getLastError() const 00214 { 00215 return myLastError; 00216 } 00217 00218 #endif //! tcpMsgSocketMgr_H_