@@ -766,10 +766,7 @@ func (c *Common) commonTCPLoop() {
766766 // 注册取消函数
767767 c .cancelMap .Store (id , func () {
768768 if targetConn != nil {
769- targetConn .SetReadDeadline (time .Now ())
770- }
771- if remoteConn != nil {
772- remoteConn .SetReadDeadline (time .Now ())
769+ targetConn .Close ()
773770 }
774771 })
775772 defer c .cancelMap .Delete (id )
@@ -909,7 +906,9 @@ func (c *Common) commonUDPLoop() {
909906 // 通过读超时机制实现取消
910907 go func () {
911908 <- ctx .Done ()
912- remoteConn .SetReadDeadline (time .Now ())
909+ if remoteConn != nil {
910+ remoteConn .SetReadDeadline (time .Now ())
911+ }
913912 }()
914913
915914 for {
@@ -1133,10 +1132,7 @@ func (c *Common) commonTCPOnce(signalURL *url.URL) {
11331132 // 注册取消函数
11341133 c .cancelMap .Store (id , func () {
11351134 if targetConn != nil {
1136- targetConn .SetReadDeadline (time .Now ())
1137- }
1138- if remoteConn != nil {
1139- remoteConn .SetReadDeadline (time .Now ())
1135+ targetConn .Close ()
11401136 }
11411137 })
11421138 defer c .cancelMap .Delete (id )
@@ -1255,19 +1251,24 @@ func (c *Common) commonUDPOnce(signalURL *url.URL) {
12551251
12561252 done := make (chan struct {}, 2 )
12571253
1254+ // 通过连接关闭和读超时机制实现取消
1255+ go func () {
1256+ <- ctx .Done ()
1257+ if targetConn != nil {
1258+ targetConn .Close ()
1259+ }
1260+ if remoteConn != nil {
1261+ remoteConn .SetReadDeadline (time .Now ())
1262+ }
1263+ }()
1264+
12581265 go func () {
12591266 defer func () { done <- struct {}{} }()
12601267
12611268 buffer := c .getUDPBuffer ()
12621269 defer c .putUDPBuffer (buffer )
12631270 reader := & conn.TimeoutReader {Conn : remoteConn , Timeout : c .readTimeout }
12641271
1265- // 通过读超时机制实现取消
1266- go func () {
1267- <- ctx .Done ()
1268- remoteConn .SetReadDeadline (time .Now ())
1269- }()
1270-
12711272 for {
12721273 // 从隧道连接读取数据
12731274 x , err := reader .Read (buffer )
@@ -1299,12 +1300,6 @@ func (c *Common) commonUDPOnce(signalURL *url.URL) {
12991300 defer c .putUDPBuffer (buffer )
13001301 reader := & conn.TimeoutReader {Conn : targetConn , Timeout : c .readTimeout }
13011302
1302- // 通过读超时机制实现取消
1303- go func () {
1304- <- ctx .Done ()
1305- targetConn .SetReadDeadline (time .Now ())
1306- }()
1307-
13081303 for {
13091304 // 从目标UDP连接读取数据
13101305 x , err := reader .Read (buffer )
0 commit comments