Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
U
uniset2
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
1
Issues
1
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
UniSet project repositories
uniset2
Commits
4f989e2e
Commit
4f989e2e
authored
Feb 20, 2016
by
Pavel Vainerman
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
(Modbus): попытка решить проблемму с зависанием на отключении (disconnect) соединения
parent
d96c4120
Hide whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
34 additions
and
5 deletions
+34
-5
MBTCPMultiMaster.cc
extensions/ModbusMaster/MBTCPMultiMaster.cc
+1
-1
UTCPStream.h
include/UTCPStream.h
+3
-0
ModbusTCPMaster.h
include/modbus/ModbusTCPMaster.h
+1
-0
ModbusTCPMaster.cc
src/Communications/Modbus/ModbusTCPMaster.cc
+16
-4
UTCPStream.cc
src/Communications/TCP/UTCPStream.cc
+13
-0
No files found.
extensions/ModbusMaster/MBTCPMultiMaster.cc
View file @
4f989e2e
...
@@ -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
->
d
isconnect
();
mbi
->
mbtcp
->
forceD
isconnect
();
}
}
// проходим по списку (в обратном порядке, т.к. самый приоритетный в конце)
// проходим по списку (в обратном порядке, т.к. самый приоритетный в конце)
...
...
include/UTCPStream.h
View file @
4f989e2e
...
@@ -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
:
...
...
include/modbus/ModbusTCPMaster.h
View file @
4f989e2e
...
@@ -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
);
...
...
src/Communications/Modbus/ModbusTCPMaster.cc
View file @
4f989e2e
...
@@ -200,7 +200,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
...
@@ -200,7 +200,7 @@ mbErrCode ModbusTCPMaster::query( ModbusAddr addr, ModbusMessage& msg,
<<
endl
;
<<
endl
;
}
}
d
isconnect
();
tcp
->
forceD
isconnect
();
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
;
d
isconnect
();
tcp
->
forceD
isconnect
();
}
}
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();
d
isconnect
();
tcp
->
forceD
isconnect
();
}
}
return
erTimeOut
;
return
erTimeOut
;
...
@@ -331,7 +331,7 @@ void ModbusTCPMaster::reconnect()
...
@@ -331,7 +331,7 @@ void ModbusTCPMaster::reconnect()
if
(
tcp
)
if
(
tcp
)
{
{
tcp
->
d
isconnect
();
tcp
->
forceD
isconnect
();
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
();
...
...
src/Communications/TCP/UTCPStream.cc
View file @
4f989e2e
...
@@ -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
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment