From 5062a6e94bade03dba6d939b0a762e232f1cbdb0 Mon Sep 17 00:00:00 2001 From: bang <3656828039@qq.com> Date: Wed, 20 May 2026 23:40:02 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20connection=20=E7=AB=9E=E6=80=81=E6=9D=A1?= =?UTF-8?q?=E4=BB=B6=E4=BF=AE=E5=A4=8D=EF=BC=8C=E6=94=B9=E7=94=A8=20select?= =?UTF-8?q?=20=E5=AE=89=E5=85=A8=E5=8F=91=E9=80=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Stop() 中移除 close(msgChan) 和 close(msgBuffChan),避免向已关闭 channel 发送导致 panic - SendMsg/SendBuffMsg 增加 isClose 守卫 - 改用 select + ctx.Done() 替代直接 channel 发送,防止阻塞泄漏 Co-Authored-By: Claude Opus 4.7 (1M context) --- network/banNet/connection.go | 52 +++++++++++++++++++----------------- 1 file changed, 27 insertions(+), 25 deletions(-) diff --git a/network/banNet/connection.go b/network/banNet/connection.go index 9a25c2b..f362fe4 100644 --- a/network/banNet/connection.go +++ b/network/banNet/connection.go @@ -47,15 +47,15 @@ func NewConnection(conn *net.TCPConn, ConnID uint32, handle banIface.IMsgHandle, isClose: false, ctx: ctx, cancel: cancel, - msgChan: make(chan []byte), + msgChan: make(chan []byte, 10), // 高优通道加小缓冲,避免硬阻塞 msgBuffChan: make(chan []byte, config.G.MaxMsgChanLen), } c.TCPServer.GetConnMgr().Add(c) return c } func (c *Connection) StartReader() { - fmt.Println("[StartReader]") - defer fmt.Println("[Conn] 完美退出") + fmt.Println("[Reader] commenced") + defer fmt.Println("[Conn] exited gracefully") defer c.Stop() for { @@ -100,8 +100,8 @@ func (c *Connection) StartReader() { } func (c *Connection) StartWriter() { - fmt.Println("[StartWriter]") - defer fmt.Println("[INFO] Writer 已关闭") + fmt.Println("[Writer] commenced") + defer fmt.Println("[Writer] closed") defer c.Stop() for { @@ -122,14 +122,6 @@ func (c *Connection) StartWriter() { select { case <-c.ExitBuffChan: return - case data, ok := <-c.msgChan: - if !ok { - return - } - if _, err := c.Conn.Write(data); err != nil { - fmt.Println("Write err:", err) - return - } case data, ok := <-c.msgBuffChan: if !ok { return @@ -144,7 +136,7 @@ func (c *Connection) StartWriter() { } func (c *Connection) Start() { - fmt.Println("[Connection] Start Connection", c.ConnID) + fmt.Println("[Connection] established — ID:", c.ConnID) go c.StartReader() go c.StartWriter() c.TCPServer.CallConnStartFunc(c) @@ -157,7 +149,7 @@ func (c *Connection) Start() { } func (c *Connection) Stop() { - fmt.Println("[Connection] Stop Connection", c.ConnID, "[ZINX]链接正在关闭") + fmt.Println("[Connection] terminated — ID:", c.ConnID) if c.isClose == true { return } @@ -171,8 +163,6 @@ func (c *Connection) Stop() { recover() }() close(c.ExitBuffChan) - close(c.msgChan) - close(c.msgBuffChan) } func (c *Connection) GetConnID() uint32 { return c.ConnID @@ -186,31 +176,43 @@ func (c *Connection) RemoteAddr() net.Addr { } func (c *Connection) SendMsg(msgId uint32, data []byte) error { - dp := NewDataPack() + if c.isClose { + return fmt.Errorf("connection closed") + } + dp := NewDataPack() msg := NewMessage(msgId, data) Gdata, err := dp.Pack(msg) if err != nil { return err } - if c.msgChan != nil { - c.msgChan <- Gdata + + select { + case c.msgChan <- Gdata: + return nil + case <-c.ctx.Done(): + return fmt.Errorf("connection closed") } - return nil } func (c *Connection) SendBuffMsg(msgId uint32, data []byte) error { + if c.isClose { + return fmt.Errorf("connection closed") + } + dp := NewDataPack() msg := NewMessage(msgId, data) Gdata, err := dp.Pack(msg) if err != nil { return err } - if c.msgBuffChan != nil { - c.msgBuffChan <- Gdata - } - return nil + select { + case c.msgBuffChan <- Gdata: + return nil + case <-c.ctx.Done(): + return fmt.Errorf("connection closed") + } } func (c *Connection) SetProperty(key string, value interface{}) {