UniSet  2.0.0
ModbusTCPServer.h
00001 // -------------------------------------------------------------------------
00002 #ifndef ModbusTCPServer_H_
00003 #define ModbusTCPServer_H_
00004 // -------------------------------------------------------------------------
00005 #include <string>
00006 #include <queue>
00007 #include <cc++/socket.h>
00008 #include "Mutex.h"
00009 #include "Debug.h"
00010 #include "Configuration.h"
00011 #include "PassiveTimer.h"
00012 #include "ModbusTypes.h"
00013 #include "ModbusServer.h"
00014 #include "ModbusTCPSession.h"
00015 
00016 // -------------------------------------------------------------------------
00018 class ModbusTCPServer:
00019     public ModbusServer,
00020     public ost::TCPSocket
00021 {
00022     public:
00023         ModbusTCPServer( ost::InetAddress &ia, int port=502 );
00024         virtual ~ModbusTCPServer();
00025 
00027         virtual ModbusRTU::mbErrCode receive( ModbusRTU::ModbusAddr mbaddr, timeout_t msecTimeout ) override;
00028 
00033         virtual bool waitQuery( ModbusRTU::ModbusAddr mbaddr, timeout_t msec = UniSetTimer::WaitUpTime );
00034 
00035         void setMaxSessions( unsigned int num );
00036         inline unsigned int getMaxSessions(){ return maxSessions; }
00037 
00039         void setSessionTimeout( timeout_t msec );
00040         inline timeout_t getSessionTimeout(){ return sessTimeout; }
00041 
00043         unsigned getCountSessions();
00044 
00045         inline void setIgnoreAddrMode( bool st ){ ignoreAddr = st; }
00046         inline bool getIgnoreAddrMode(){ return ignoreAddr; }
00047 
00048         void cleanInputStream();
00049         virtual void cleanupChannel() override { cleanInputStream(); }
00050 
00051         virtual void terminate() override;
00052 
00053         // Сбор статистики по соединениям...
00054         struct SessionInfo
00055         {
00056             SessionInfo( const std::string& a, unsigned int ask ):iaddr(a),askCount(ask){}
00057 
00058             std::string iaddr;
00059             unsigned int askCount;
00060         };
00061 
00062         typedef std::list<SessionInfo> Sessions;
00063 
00064         void getSessions( Sessions& lst );
00065 
00066     protected:
00067 
00068         virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request ) override;
00069         virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request ) override;
00070 
00071         // realisation (see ModbusServer.h)
00072         virtual int getNextData( unsigned char* buf, int len ) override;
00073         virtual void setChannelTimeout( timeout_t msec ) override;
00074         virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) override;
00075 
00076         virtual ModbusRTU::mbErrCode tcp_processing( ost::TCPStream& tcp, ModbusTCP::MBAPHeader& mhead );
00077         void sessionFinished( ModbusTCPSession* s );
00078 
00079         ost::tpport_t port;
00080         ost::TCPStream tcp;
00081         ost::InetAddress iaddr;
00082         std::queue<unsigned char> qrecv;
00083         ModbusTCP::MBAPHeader curQueryHeader;
00084 
00085         typedef std::list<ModbusTCPSession*> SessionList;
00086         UniSetTypes::uniset_mutex sMutex;
00087         SessionList slist;
00088 
00089         bool ignoreAddr;
00090 
00091         unsigned int maxSessions;
00092         unsigned int sessCount;
00093 
00094         timeout_t sessTimeout;
00095 
00096     private:
00097 
00098         std::atomic_bool cancelled;
00099 };
00100 // -------------------------------------------------------------------------
00101 #endif // ModbusTCPServer_H_
00102 // -------------------------------------------------------------------------