Commit 4f355923 authored by Pavel Vainerman's avatar Pavel Vainerman

(MBTCPMaster): попытка использовать select() вместо poll()

parent b93be6d3
......@@ -56,6 +56,9 @@ class ModbusTCPMaster:
virtual ModbusRTU::mbErrCode query( ModbusRTU::ModbusAddr addr, ModbusRTU::ModbusMessage& msg,
ModbusRTU::ModbusMessage& reply, timeout_t timeout ) override;
bool waitInput( int timeout_msec );
bool waitOutput( int timeout_msec );
private:
//ost::TCPStream* tcp;
std::shared_ptr<UTCPStream> tcp;
......@@ -66,6 +69,10 @@ class ModbusTCPMaster:
int port = { 0 };
bool force_disconnect = { false };
int keepAliveTimeout = { 1000 };
// структура для реализации использования select
fd_set s_set;
timeval s_timeout;
};
// -------------------------------------------------------------------------
#endif // ModbusTCPMaster_H_
......
......@@ -116,9 +116,10 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
msg.makeHead(++nTransaction, crcNoCheckit);
for( unsigned int i = 0; i < 2; i++ )
for( size_t i = 0; i < 2; i++ )
{
if( tcp->isPending(ost::Socket::pendingOutput, timeout) )
//if( tcp->isPending(ost::Socket::pendingOutput, timeout) )
if( waitOutput(timeout) )
{
mbErrCode res = send(msg);
......@@ -165,7 +166,8 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
tcp->sync();
//reply.clear();
if( tcp->isPending(ost::Socket::pendingInput, timeout) )
//if( tcp->isPending(ost::Socket::pendingInput, timeout) )
if( waitInput(timeout) )
{
size_t ret = 0;
......@@ -176,7 +178,8 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
if( ret == sizeof(reply.aduhead) )
break;
if( !tcp->isPending(ost::Socket::pendingInput, timeout) )
//if( !tcp->isPending(ost::Socket::pendingInput, timeout) )
if( !waitInput(timeout) )
break;
}
......@@ -317,6 +320,35 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
return erTimeOut; // erHardwareError
}
// -------------------------------------------------------------------------
bool ModbusTCPMaster::waitInput( int msec )
{
if( !tcp )
return false;
FD_ZERO (&s_set);
FD_SET (tcp->getSocket(), &s_set);
s_timeout.tv_sec = 0;
s_timeout.tv_usec = 1000*msec;
return ( select( 1+(int)tcp->getSocket(), &s_set, NULL, NULL, &s_timeout) > 0 );
}
// -------------------------------------------------------------------------
bool ModbusTCPMaster::waitOutput( int timeout_msec )
{
if( !tcp )
return false;
FD_ZERO (&s_set);
FD_SET (tcp->getSocket(), &s_set);
s_timeout.tv_sec = 0;
s_timeout.tv_usec = 1000*timeout_msec;
//return ( select(FD_SETSIZE, NULL, &s_set, NULL, &s_timeout) > 0 );
return ( select(1+(int)tcp->getSocket(), NULL, &s_set, NULL, &s_timeout) > 0 );
}
// -------------------------------------------------------------------------
void ModbusTCPMaster::cleanInputStream()
{
unsigned char buf[100];
......
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