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

(Modbus): попытка решить проблемму с зависанием на отключении (disconnect) соединения

parent d96c4120
...@@ -230,7 +230,7 @@ std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen ) ...@@ -230,7 +230,7 @@ std::shared_ptr<ModbusClient> MBTCPMultiMaster::initMB( bool reopen )
} }
if( mbi != mblist.rend() ) if( mbi != mblist.rend() )
mbi->mbtcp->disconnect(); mbi->mbtcp->forceDisconnect();
} }
// проходим по списку (в обратном порядке, т.к. самый приоритетный в конце) // проходим по списку (в обратном порядке, т.к. самый приоритетный в конце)
......
...@@ -23,6 +23,9 @@ class UTCPStream: ...@@ -23,6 +23,9 @@ class UTCPStream:
// return true if OK // return true if OK
bool setKeepAliveParams( timeout_t timeout_sec = 5, int conn_keepcnt = 1, int keepintvl = 2 ); bool setKeepAliveParams( timeout_t timeout_sec = 5, int conn_keepcnt = 1, int keepintvl = 2 );
bool isSetLinger();
void forceDisconnect(); // disconnect() без ожидания (с отключением SO_LINGER)
protected: protected:
private: private:
......
...@@ -21,6 +21,7 @@ class ModbusTCPMaster: ...@@ -21,6 +21,7 @@ class ModbusTCPMaster:
void connect( const std::string& addr, int port ); void connect( const std::string& addr, int port );
void connect( ost::InetAddress addr, int port ); void connect( ost::InetAddress addr, int port );
void disconnect(); void disconnect();
void forceDisconnect();
bool isConnection(); bool isConnection();
static bool checkConnection( const std::string& ip, int port, int timeout_msec = 100 ); static bool checkConnection( const std::string& ip, int port, int timeout_msec = 100 );
......
...@@ -200,7 +200,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -200,7 +200,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
<< endl; << endl;
} }
disconnect(); tcp->forceDisconnect();
return erTimeOut; // return erHardwareError; return erTimeOut; // return erHardwareError;
} }
...@@ -238,7 +238,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -238,7 +238,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
if( dlog->is_info() ) if( dlog->is_info() )
dlog->info() << "(query): force disconnect.." << endl; dlog->info() << "(query): force disconnect.." << endl;
disconnect(); tcp->forceDisconnect();
} }
return res; return res;
...@@ -253,7 +253,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg, ...@@ -253,7 +253,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
dlog->info() << "(query): force disconnect.." << endl; dlog->info() << "(query): force disconnect.." << endl;
// cleanInputStream(); // cleanInputStream();
disconnect(); tcp->forceDisconnect();
} }
return erTimeOut; return erTimeOut;
...@@ -331,7 +331,7 @@ void ModbusTCPMaster::reconnect() ...@@ -331,7 +331,7 @@ void ModbusTCPMaster::reconnect()
if( tcp ) if( tcp )
{ {
tcp->disconnect(); tcp->forceDisconnect();
tcp.reset(); tcp.reset();
} }
...@@ -430,6 +430,18 @@ void ModbusTCPMaster::disconnect() ...@@ -430,6 +430,18 @@ void ModbusTCPMaster::disconnect()
tcp.reset(); tcp.reset();
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
void ModbusTCPMaster::forceDisconnect()
{
if( dlog->is_info() )
dlog->info() << iaddr << "(ModbusTCPMaster): FORCE disconnect (" << iaddr << ":" << port << ")." << endl;
if( !tcp )
return;
tcp->forceDisconnect();
tcp.reset();
}
// -------------------------------------------------------------------------
bool ModbusTCPMaster::isConnection() bool ModbusTCPMaster::isConnection()
{ {
return tcp && tcp->isConnected(); return tcp && tcp->isConnected();
......
...@@ -44,6 +44,19 @@ bool UTCPStream::setKeepAliveParams(timeout_t timeout_sec, int keepcnt, int keep ...@@ -44,6 +44,19 @@ bool UTCPStream::setKeepAliveParams(timeout_t timeout_sec, int keepcnt, int keep
return ok; return ok;
} }
// ------------------------------------------------------------------------- // -------------------------------------------------------------------------
bool UTCPStream::isSetLinger()
{
return Socket::flags.linger;
}
// -------------------------------------------------------------------------
void UTCPStream::forceDisconnect()
{
bool f = Socket::flags.linger;
Socket::flags.linger = false;
disconnect();
Socket::flags.linger = f;
}
// -------------------------------------------------------------------------
void UTCPStream::create( const std::string& hname, int port, bool throwflag, timeout_t t ) void UTCPStream::create( const std::string& hname, int port, bool throwflag, timeout_t t )
{ {
family = ost::Socket::IPV4; family = ost::Socket::IPV4;
......
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