|
UniSet
2.2.1
|
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 // -------------------------------------------------------------------------
1.7.6.1