gonet icon indicating copy to clipboard operation
gonet copied to clipboard

ServerSocketClient协程被阻塞

Open hsz8250 opened this issue 3 years ago • 2 comments

建议不要在Socket的Stop函数中不要去关闭conn,因为有可能导致Run中的conn.Read会阻塞无法返回,导致无法释放 然后最好在conn.Read之前加一个读取超时,可以跟心跳测试的间隔时间一致的30秒,把conn.Stop 放在Socket.Close一起处理 让Run这个协程能够顺利执行和释放,原来的Socket的Stop只是改变一个状态,然后再Run的loop函数中针对状态,如果状态是SSF_STOP 直接退出循环,特别是在KCP模式下很容阻塞不释放。

if this.GetState() != SSF_RUN { return false }

this.conn.(kcp.UDPSession).SetDeadline(time.Now().Add(time.SecondHEART_TIME_OUT)) GJ%5OVDFC80$3Y)_QV VTAR

F `B5(P}3FZ7JEA1EU)UY7P

hsz8250 avatar Oct 30 '21 03:10 hsz8250

但不关闭连接的时候,如果客户端不发消息了,不是会阻塞在Read这里吗?

buguang01 avatar Nov 18 '21 02:11 buguang01

h

建议不要在Socket的Stop函数中不要去关闭conn,因为有可能导致Run中的conn.Read会阻塞无法返回,导致无法释放 然后最好在conn.Read之前加一个读取超时,可以跟心跳测试的间隔时间一致的30秒,把conn.Stop 放在Socket.Close一起处理 让Run这个协程能够顺利执行和释放,原来的Socket的Stop只是改变一个状态,然后再Run的loop函数中针对状态,如果状态是SSF_STOP 直接退出循环,特别是在KCP模式下很容阻塞不释放。

if this.GetState() != SSF_RUN { return false }

this.conn.(_kcp.UDPSession).SetDeadline(time.Now().Add(time.Second_HEART_TIME_OUT)) GJ%5OVDFC80$3Y)_QV VTAR

F `B5(P}3FZ7JEA1EU)UY7P

是可以这么做,再stop的时候设置SetDeadline

bobohume avatar Feb 23 '22 11:02 bobohume