2 #ifndef ModbusTCPServer_H_
3 #define ModbusTCPServer_H_
8 #include <sigc++/sigc++.h>
11 #include "Configuration.h"
12 #include "PassiveTimer.h"
13 #include "ModbusTypes.h"
14 #include "ModbusServer.h"
15 #include "ModbusTCPSession.h"
16 #include "UTCPSocket.h"
17 #include "EventLoopServer.h"
41 bool run(
const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr );
46 bool async_run(
const std::unordered_set<ModbusRTU::ModbusAddr>& vmbaddr );
51 virtual bool isActive()
const override;
53 void setMaxSessions(
size_t num );
54 size_t getMaxSessions()
const noexcept;
58 timeout_t getSessionTimeout()
const noexcept;
63 void setIgnoreAddrMode(
bool st );
64 bool getIgnoreAddrMode()
const noexcept;
69 SessionInfo(
const std::string& a,
size_t ask ): iaddr(a), askCount(ask) {}
75 typedef std::list<SessionInfo> Sessions;
77 void getSessions( Sessions& lst );
79 std::string getInetAddress() const noexcept;
80 int getInetPort() const noexcept;
83 size_t getConnectionCount() const noexcept;
92 typedef sigc::signal<
void> TimerSignal;
93 TimerSignal signal_timer();
95 void setTimer( timeout_t msec );
96 timeout_t getTimer() const noexcept;
101 virtual
void iowait( timeout_t msec ) override;
104 virtual ModbusRTU::mbErrCode
realReceive( const std::unordered_set<ModbusRTU::ModbusAddr>& vaddr, timeout_t msecTimeout ) override;
106 virtual
void evprepare() override;
107 virtual
void evfinish() override;
109 virtual
void ioAccept(ev::io& watcher,
int revents);
110 void onTimer( ev::timer& t,
int revents );
114 virtual
size_t getNextData(
unsigned char* buf,
int len )
override
119 virtual ModbusRTU::mbErrCode sendData(
unsigned char* buf,
int len )
override
121 return ModbusRTU::erHardwareError;
130 std::queue<unsigned char> qrecv;
131 ModbusRTU::MBAPHeader curQueryHeader;
134 typedef std::list<std::shared_ptr<ModbusTCPSession>> SessionList;
137 bool ignoreAddr = {
false };
139 size_t maxSessions = { 100 };
140 size_t sessCount = { 0 };
143 size_t connCount = { 0 };
145 timeout_t sessTimeout = { 10000 };
149 std::shared_ptr<UTCPSocket> sock;
151 std::unordered_set<ModbusRTU::ModbusAddr> vmbaddr;
152 TimerSignal m_timer_signal;
155 double tmTime = { 0.0 };
161 void postReceiveEvent( ModbusRTU::mbErrCode res );
162 ModbusRTU::mbErrCode preReceiveEvent(
const std::unordered_set<ModbusRTU::ModbusAddr> vaddr, timeout_t tout );
167 #endif // ModbusTCPServer_H_