Commit 23329f52 authored by Pavel Vainerman's avatar Pavel Vainerman

(MBTCPMaster): исправил ошибки в логах

(PassiveTimer): рефакторинг функций преобразования timeout_t --> Poco::Timespan Разобрался с milliseconds, microseconds перевёл везде на использование функций преобразования.
parent b161ad2b
...@@ -115,7 +115,7 @@ bool UNetSender::createConnection( bool throwEx ) ...@@ -115,7 +115,7 @@ bool UNetSender::createConnection( bool throwEx )
//udp = make_shared<UDPSocketU>(addr, port); //udp = make_shared<UDPSocketU>(addr, port);
udp = make_shared<UDPSocketU>(); udp = make_shared<UDPSocketU>();
udp->setBroadcast(true); udp->setBroadcast(true);
udp->setSendTimeout(UniSetTimer::timeoutToPoco(writeTimeout * 1000)); udp->setSendTimeout( UniSetTimer::millisecToPoco(writeTimeout) );
// udp->setNoDelay(true); // udp->setNoDelay(true);
} }
catch( const std::exception& e ) catch( const std::exception& e )
...@@ -286,14 +286,14 @@ void UNetSender::real_send( PackMessage& mypack ) ...@@ -286,14 +286,14 @@ void UNetSender::real_send( PackMessage& mypack )
if( packetnum == 0 ) if( packetnum == 0 )
packetnum = 1; packetnum = 1;
if( !udp || !udp->poll(writeTimeout * 1000, Poco::Net::Socket::SELECT_WRITE) ) if( !udp || !udp->poll( UniSetTimer::millisecToPoco(writeTimeout), Poco::Net::Socket::SELECT_WRITE) )
return; return;
mypack.msg.transport_msg(s_msg); mypack.msg.transport_msg(s_msg);
try try
{ {
size_t ret = udp->sendTo((char*)s_msg.data, s_msg.len, saddr); size_t ret = udp->sendTo(&s_msg.data, s_msg.len, saddr);
if( ret < s_msg.len ) if( ret < s_msg.len )
unetcrit << myname << "(real_send): FAILED ret=" << ret << " < sizeof=" << s_msg.len << endl; unetcrit << myname << "(real_send): FAILED ret=" << ret << " < sizeof=" << s_msg.len << endl;
......
...@@ -63,7 +63,7 @@ static UniSetUDP::UDPMessage receive( unsigned int pnum = 0, timeout_t tout = 20 ...@@ -63,7 +63,7 @@ static UniSetUDP::UDPMessage receive( unsigned int pnum = 0, timeout_t tout = 20
while( ncycle > 0 ) while( ncycle > 0 )
{ {
if( !udp_r->poll(tout * 1000, Poco::Net::Socket::SELECT_READ) ) if( !udp_r->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_READ) )
break; break;
size_t ret = udp_r->receiveBytes(&(buf.data), sizeof(buf.data) ); size_t ret = udp_r->receiveBytes(&(buf.data), sizeof(buf.data) );
...@@ -81,7 +81,7 @@ static UniSetUDP::UDPMessage receive( unsigned int pnum = 0, timeout_t tout = 20 ...@@ -81,7 +81,7 @@ static UniSetUDP::UDPMessage receive( unsigned int pnum = 0, timeout_t tout = 20
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
void send( UniSetUDP::UDPMessage& pack, int tout = 2000 ) void send( UniSetUDP::UDPMessage& pack, int tout = 2000 )
{ {
CHECK( udp_s->poll(tout * 1000, Poco::Net::Socket::SELECT_WRITE) ); CHECK( udp_s->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_WRITE) );
pack.nodeID = s_nodeID; pack.nodeID = s_nodeID;
pack.procID = s_procID; pack.procID = s_procID;
...@@ -89,7 +89,7 @@ void send( UniSetUDP::UDPMessage& pack, int tout = 2000 ) ...@@ -89,7 +89,7 @@ void send( UniSetUDP::UDPMessage& pack, int tout = 2000 )
UniSetUDP::UDPPacket s_buf; UniSetUDP::UDPPacket s_buf;
pack.transport_msg(s_buf); pack.transport_msg(s_buf);
size_t ret = udp_s->sendTo((char*)&s_buf.data, s_buf.len, s_addr); size_t ret = udp_s->sendTo(&s_buf.data, s_buf.len, s_addr);
REQUIRE( ret == s_buf.len ); REQUIRE( ret == s_buf.len );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
......
...@@ -243,7 +243,7 @@ int main(int argc, char* argv[]) ...@@ -243,7 +243,7 @@ int main(int argc, char* argv[])
npack = 0; npack = 0;
} }
if( !udp.poll(tout * 1000, Poco::Net::Socket::SELECT_READ) ) if( !udp.poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_READ) )
{ {
cout << "(recv): Timeout.." << endl; cout << "(recv): Timeout.." << endl;
continue; continue;
...@@ -362,7 +362,7 @@ int main(int argc, char* argv[]) ...@@ -362,7 +362,7 @@ int main(int argc, char* argv[])
try try
{ {
if( udp->poll(tout * 1000, Poco::Net::Socket::SELECT_WRITE) ) if( udp->poll(UniSetTimer::millisecToPoco(tout), Poco::Net::Socket::SELECT_WRITE) )
{ {
mypack.transport_msg(s_buf); mypack.transport_msg(s_buf);
......
...@@ -65,8 +65,9 @@ class UniSetTimer ...@@ -65,8 +65,9 @@ class UniSetTimer
*/ */
static const timeout_t WaitUpTime = std::numeric_limits<timeout_t>::max(); static const timeout_t WaitUpTime = std::numeric_limits<timeout_t>::max();
// преобразование WaitUpTime в Poco waitpuTime у которого он = 0 :( // преобразование с учётом WaitUpTime, т.к. в Poco::Timespan вечное ожидание это "0" :(
static const Poco::Timespan timeoutToPoco( const timeout_t ); static const Poco::Timespan millisecToPoco( const timeout_t msec );
static const Poco::Timespan microsecToPoco( const timeout_t usec );
/*! Минимальное время срабатывания. Задается в мсек. /*! Минимальное время срабатывания. Задается в мсек.
* Используется в LT_Object и CallbackTimer * Используется в LT_Object и CallbackTimer
......
...@@ -58,7 +58,7 @@ void ModbusTCPMaster::setChannelTimeout( timeout_t msec ) ...@@ -58,7 +58,7 @@ void ModbusTCPMaster::setChannelTimeout( timeout_t msec )
if( !tcp ) if( !tcp )
return; return;
Poco::Timespan tm = UniSetTimer::timeoutToPoco(msec*1000); Poco::Timespan tm = UniSetTimer::millisecToPoco(msec);
Poco::Timespan old = tcp->getReceiveTimeout();; Poco::Timespan old = tcp->getReceiveTimeout();;
if( old.microseconds() == tm.microseconds() ) if( old.microseconds() == tm.microseconds() )
...@@ -112,17 +112,12 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -112,17 +112,12 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
assert(timeout); assert(timeout);
ptTimeout.setTiming(timeout); ptTimeout.setTiming(timeout);
if( timeout == UniSetTimer::WaitUpTime ) tcp->setReceiveTimeout( UniSetTimer::millisecToPoco(timeout) );
tcp->setReceiveTimeout(0);
else
tcp->setReceiveTimeout(timeout * 1000);
msg.makeHead(++nTransaction, crcNoCheckit); msg.makeHead(++nTransaction, crcNoCheckit);
for( size_t i = 0; i < 2; i++ ) for( size_t i = 0; i < 2; i++ )
{ {
//if( tcp->isPending(ost::Socket::pendingOutput, timeout) ) if( tcp->poll(UniSetTimer::millisecToPoco(timeout), Poco::Net::Socket::SELECT_WRITE) )
if( tcp->poll(timeout * 1000, Poco::Net::Socket::SELECT_WRITE) )
{ {
mbErrCode res = send(msg); mbErrCode res = send(msg);
...@@ -168,7 +163,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -168,7 +163,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
//tcp->sync(); //tcp->sync();
if( tcp->poll(timeout * 1000, Poco::Net::Socket::SELECT_READ ) ) if( tcp->poll(UniSetTimer::millisecToPoco(timeout), Poco::Net::Socket::SELECT_READ ) )
{ {
size_t ret = 0; size_t ret = 0;
...@@ -237,7 +232,6 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -237,7 +232,6 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
} }
// //
timeout = ptTimeout.getLeft(timeout); timeout = ptTimeout.getLeft(timeout);
if( timeout <= 0 ) if( timeout <= 0 )
...@@ -295,7 +289,8 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -295,7 +289,8 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
if( dlog->is_crit() ) if( dlog->is_crit() )
dlog->crit() << "(query): " << ex << endl; dlog->crit() << "(query): " << ex << endl;
tcp->forceDisconnect(); if( tcp )
tcp->forceDisconnect();
} }
catch( const UniSetTypes::Exception& ex ) catch( const UniSetTypes::Exception& ex )
{ {
...@@ -380,7 +375,7 @@ void ModbusTCPMaster::reconnect() ...@@ -380,7 +375,7 @@ void ModbusTCPMaster::reconnect()
{ {
tcp = make_shared<UTCPStream>(); tcp = make_shared<UTCPStream>();
tcp->create(iaddr, port, 500); tcp->create(iaddr, port, 500);
tcp->setReceiveTimeout(UniSetTimer::timeoutToPoco(replyTimeOut_ms * 1000)); tcp->setReceiveTimeout(UniSetTimer::millisecToPoco(replyTimeOut_ms));
tcp->setKeepAliveParams((replyTimeOut_ms > 1000 ? replyTimeOut_ms / 1000 : 1)); tcp->setKeepAliveParams((replyTimeOut_ms > 1000 ? replyTimeOut_ms / 1000 : 1));
tcp->setNoDelay(true); tcp->setNoDelay(true);
} }
...@@ -389,7 +384,7 @@ void ModbusTCPMaster::reconnect() ...@@ -389,7 +384,7 @@ void ModbusTCPMaster::reconnect()
if( dlog->debugging(Debug::CRIT) ) if( dlog->debugging(Debug::CRIT) )
{ {
ostringstream s; ostringstream s;
s << "(ModbusTCPMaster): connection " << s.str() << " error: " << e.what(); s << "(ModbusTCPMaster): connection " << iaddr << ":" << port << " error: " << e.what();
dlog->crit() << s.str() << std::endl; dlog->crit() << s.str() << std::endl;
} }
} }
...@@ -398,7 +393,7 @@ void ModbusTCPMaster::reconnect() ...@@ -398,7 +393,7 @@ void ModbusTCPMaster::reconnect()
if( dlog->debugging(Debug::CRIT) ) if( dlog->debugging(Debug::CRIT) )
{ {
ostringstream s; ostringstream s;
s << "(ModbusTCPMaster): connection " << s.str() << " error: catch ..."; s << "(ModbusTCPMaster): connection " << iaddr << ":" << port << " error: catch ...";
dlog->crit() << s.str() << std::endl; dlog->crit() << s.str() << std::endl;
} }
} }
...@@ -430,7 +425,7 @@ void ModbusTCPMaster::connect( const Poco::Net::SocketAddress& addr, int _port ) ...@@ -430,7 +425,7 @@ void ModbusTCPMaster::connect( const Poco::Net::SocketAddress& addr, int _port )
tcp = make_shared<UTCPStream>(); tcp = make_shared<UTCPStream>();
tcp->create(iaddr, port, 500); tcp->create(iaddr, port, 500);
//tcp->connect(addr,500); //tcp->connect(addr,500);
tcp->setReceiveTimeout(replyTimeOut_ms * 1000); tcp->setReceiveTimeout(UniSetTimer::millisecToPoco(replyTimeOut_ms));
tcp->setKeepAlive(true); // tcp->setKeepAliveParams((replyTimeOut_ms > 1000 ? replyTimeOut_ms / 1000 : 1)); tcp->setKeepAlive(true); // tcp->setKeepAliveParams((replyTimeOut_ms > 1000 ? replyTimeOut_ms / 1000 : 1));
tcp->setNoDelay(true); tcp->setNoDelay(true);
} }
......
...@@ -19,6 +19,7 @@ ...@@ -19,6 +19,7 @@
#include <Poco/Net/NetException.h> #include <Poco/Net/NetException.h>
#include <iostream> #include <iostream>
#include <sstream> #include <sstream>
#include "PassiveTimer.h"
#include "Exceptions.h" #include "Exceptions.h"
#include "LogReader.h" #include "LogReader.h"
#include "UniSetTypes.h" #include "UniSetTypes.h"
...@@ -78,8 +79,8 @@ void LogReader::connect( const std::string& _addr, int _port, timeout_t msec ) ...@@ -78,8 +79,8 @@ void LogReader::connect( const std::string& _addr, int _port, timeout_t msec )
{ {
tcp = make_shared<UTCPStream>(); tcp = make_shared<UTCPStream>();
tcp->create(iaddr, port, msec ); tcp->create(iaddr, port, msec );
tcp->setReceiveTimeout( UniSetTimer::timeoutToPoco(inTimeout * 1000) ); tcp->setReceiveTimeout( UniSetTimer::millisecToPoco(inTimeout) );
tcp->setSendTimeout( UniSetTimer::timeoutToPoco(outTimeout * 1000) ); tcp->setSendTimeout( UniSetTimer::millisecToPoco(outTimeout) );
tcp->setKeepAlive(true); tcp->setKeepAlive(true);
tcp->setBlocking(true); tcp->setBlocking(true);
} }
...@@ -254,7 +255,7 @@ void LogReader::sendCommand(const std::string& _addr, int _port, std::vector<Com ...@@ -254,7 +255,7 @@ void LogReader::sendCommand(const std::string& _addr, int _port, std::vector<Com
{ {
int a = 2; int a = 2;
while( a > 0 && tcp->poll(reply_timeout * 1000, Poco::Net::Socket::SELECT_READ) ) while( a > 0 && tcp->poll(UniSetTimer::millisecToPoco(reply_timeout), Poco::Net::Socket::SELECT_READ) )
{ {
int n = tcp->available(); int n = tcp->available();
...@@ -336,7 +337,7 @@ void LogReader::readlogs( const std::string& _addr, int _port, LogServerTypes::C ...@@ -336,7 +337,7 @@ void LogReader::readlogs( const std::string& _addr, int _port, LogServerTypes::C
send_ok = true; send_ok = true;
} }
while( tcp->poll(inTimeout * 1000, Poco::Net::Socket::SELECT_READ) ) while( tcp->poll(UniSetTimer::millisecToPoco(inTimeout), Poco::Net::Socket::SELECT_READ) )
{ {
ssize_t n = tcp->available(); ssize_t n = tcp->available();
...@@ -397,7 +398,7 @@ void LogReader::sendCommand(LogServerTypes::lsMessage& msg, bool verbose ) ...@@ -397,7 +398,7 @@ void LogReader::sendCommand(LogServerTypes::lsMessage& msg, bool verbose )
try try
{ {
if( tcp->poll(outTimeout * 1000, Poco::Net::Socket::SELECT_WRITE) ) if( tcp->poll(UniSetTimer::millisecToPoco(outTimeout), Poco::Net::Socket::SELECT_WRITE) )
{ {
rlog.info() << "(LogReader): ** send command: cmd='" << msg.cmd << "' logname='" << msg.logname << "' data='" << msg.data << "'" << endl; rlog.info() << "(LogReader): ** send command: cmd='" << msg.cmd << "' logname='" << msg.logname << "' data='" << msg.data << "'" << endl;
tcp->sendBytes((unsigned char*)(&msg), sizeof(msg)); tcp->sendBytes((unsigned char*)(&msg), sizeof(msg));
......
...@@ -111,11 +111,20 @@ void UniSetTimer::stop() ...@@ -111,11 +111,20 @@ void UniSetTimer::stop()
terminate(); terminate();
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
const Poco::Timespan UniSetTimer::timeoutToPoco( const timeout_t msec ) const Poco::Timespan UniSetTimer::millisecToPoco( const timeout_t msec )
{ {
if( msec == WaitUpTime ) if( msec == WaitUpTime )
return Poco::Timespan(0,0); return Poco::Timespan(0,0);
return Poco::Timespan(msec/100, msec%1000); // msec --> usec
return Poco::Timespan( long(msec/1000), long((msec%1000)*1000) );
}
//------------------------------------------------------------------------------
const Poco::Timespan UniSetTimer::microsecToPoco( const timeout_t usec )
{
if( usec == WaitUpTime )
return Poco::Timespan(0,0);
return Poco::Timespan( long(usec/1000000), long(usec%1000000) );
} }
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
...@@ -32,6 +32,9 @@ class PtrMapHashFn ...@@ -32,6 +32,9 @@ class PtrMapHashFn
int main( int argc, const char** argv ) int main( int argc, const char** argv )
{ {
cerr << "2000%1000000=" << int(2000%1000000) << endl;
return 0;
unordered_map<const long*, const long*, PtrMapHashFn> vmap; unordered_map<const long*, const long*, PtrMapHashFn> vmap;
const long id = 10; const long id = 10;
......
...@@ -96,3 +96,52 @@ TEST_CASE("PassiveTimer: 1 msec", "[PassiveTimer][msec]" ) ...@@ -96,3 +96,52 @@ TEST_CASE("PassiveTimer: 1 msec", "[PassiveTimer][msec]" )
CHECK( pt.checkTime() ); CHECK( pt.checkTime() );
} }
// ----------------------------------------------------------------------------- // -----------------------------------------------------------------------------
TEST_CASE("UniSetTimer: conv to Poco", "[PassiveTimer][poco]" )
{
// msec --> Poco::Timespan
{
Poco::Timespan tm = UniSetTimer::millisecToPoco(2000);
REQUIRE( tm.seconds() == 2 );
REQUIRE( tm.totalMilliseconds() == 2000 );
}
{
Poco::Timespan tm = UniSetTimer::millisecToPoco(UniSetTimer::WaitUpTime);
REQUIRE( tm.seconds() == 0 );
REQUIRE( tm.microseconds() == 0 );
}
{
Poco::Timespan tm = UniSetTimer::millisecToPoco(20);
REQUIRE( tm.seconds() == 0 );
REQUIRE( tm.milliseconds() == 20 );
REQUIRE( tm.microseconds() == 0 );
REQUIRE( tm.totalMicroseconds() == 20000 );
}
// usec --> Poco::Timespan
{
Poco::Timespan tm = UniSetTimer::microsecToPoco(UniSetTimer::WaitUpTime);
REQUIRE( tm.seconds() == 0 );
REQUIRE( tm.microseconds() == 0 );
}
{
Poco::Timespan tm = UniSetTimer::microsecToPoco(2000000);
REQUIRE( tm.seconds() == 2 );
REQUIRE( tm.microseconds() == 0 );
}
{
Poco::Timespan tm = UniSetTimer::microsecToPoco(2000);
REQUIRE( tm.seconds() == 0 );
REQUIRE( tm.totalMicroseconds() == 2000 );
REQUIRE( tm.useconds() == 2000 );
}
{
Poco::Timespan tm = UniSetTimer::microsecToPoco(2);
REQUIRE( tm.seconds() == 0 );
REQUIRE( tm.microseconds() == 2 );
}
}
// -----------------------------------------------------------------------------
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment