UniSet  2.2.1
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( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr, timeout_t msecTimeout ) override;
00028 
00033         virtual bool waitQuery( const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr, timeout_t msec = UniSetTimer::WaitUpTime );
00034 
00035         void setMaxSessions( unsigned int num );
00036         inline unsigned int getMaxSessions()
00037         {
00038             return maxSessions;
00039         }
00040 
00042         void setSessionTimeout( timeout_t msec );
00043         inline timeout_t getSessionTimeout()
00044         {
00045             return sessTimeout;
00046         }
00047 
00049         unsigned getCountSessions();
00050 
00051         inline void setIgnoreAddrMode( bool st )
00052         {
00053             ignoreAddr = st;
00054         }
00055         inline bool getIgnoreAddrMode()
00056         {
00057             return ignoreAddr;
00058         }
00059 
00060         void cleanInputStream();
00061         virtual void cleanupChannel() override
00062         {
00063             cleanInputStream();
00064         }
00065 
00066         virtual void terminate() override;
00067 
00068         // Сбор статистики по соединениям...
00069         struct SessionInfo
00070         {
00071             SessionInfo( const std::string& a, unsigned int ask ): iaddr(a), askCount(ask) {}
00072 
00073             std::string iaddr;
00074             unsigned int askCount;
00075         };
00076 
00077         typedef std::list<SessionInfo> Sessions;
00078 
00079         void getSessions( Sessions& lst );
00080 
00081         inline ost::InetAddress getInetAddress(){ return iaddr; }
00082         inline ost::tpport_t getInetPort(){ return port; }
00083 
00084     protected:
00085 
00086         virtual ModbusRTU::mbErrCode pre_send_request( ModbusRTU::ModbusMessage& request ) override;
00087         virtual ModbusRTU::mbErrCode post_send_request( ModbusRTU::ModbusMessage& request ) override;
00088 
00089         // realisation (see ModbusServer.h)
00090         virtual int getNextData( unsigned char* buf, int len ) override;
00091         virtual void setChannelTimeout( timeout_t msec ) override;
00092         virtual ModbusRTU::mbErrCode sendData( unsigned char* buf, int len ) override;
00093 
00094         virtual ModbusRTU::mbErrCode tcp_processing( ost::TCPStream& tcp, ModbusTCP::MBAPHeader& mhead );
00095         void sessionFinished( ModbusTCPSession* s );
00096 
00097         ost::tpport_t port = { 0 };
00098         ost::TCPStream tcp;
00099         ost::InetAddress iaddr;
00100         std::queue<unsigned char> qrecv;
00101         ModbusTCP::MBAPHeader curQueryHeader;
00102 
00103         typedef std::list<ModbusTCPSession*> SessionList;
00104         UniSetTypes::uniset_mutex sMutex;
00105         SessionList slist;
00106 
00107         bool ignoreAddr = { false };
00108 
00109         unsigned int maxSessions = { 5 };
00110         unsigned int sessCount = { 0 };
00111 
00112         timeout_t sessTimeout = { 10000 }; // msec
00113 
00114     private:
00115 
00116         std::atomic_bool cancelled;
00117 };
00118 // -------------------------------------------------------------------------
00119 #endif // ModbusTCPServer_H_
00120 // -------------------------------------------------------------------------