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