From 910e866456d7a541a5cc4d385bba6cc4be90f23a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=98=94=E5=BF=B5?= <1@72wo.cn> Date: Sat, 13 Sep 2025 00:42:39 +0800 Subject: [PATCH] =?UTF-8?q?fix(socket):=20=E4=BC=98=E5=8C=96=20TCP=20?= =?UTF-8?q?=E8=BF=9E=E6=8E=A5=E5=A4=84=E7=90=86=E5=92=8C=E7=8E=A9=E5=AE=B6?= =?UTF-8?q?=E6=98=B5=E7=A7=B0=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 在 ServerEvent.go 中增加 TCP 连接的特殊处理逻辑,防止缓冲区溢出 - 修改 CreatePlayer.go 中的昵称处理,去除多余的空格 - 优化 mapout.go 中的玩家离开地图通知逻辑 - 在 wscodec.go 中增加对 TCP 连接的识别和处理 --- common/socket/ServerEvent.go | 7 ++++++- logic/controller/CreatePlayer.go | 14 +++++++------- logic/service/maps/mapout.go | 1 + logic/service/wscodec.go | 7 +++++++ 4 files changed, 21 insertions(+), 8 deletions(-) diff --git a/common/socket/ServerEvent.go b/common/socket/ServerEvent.go index c1232a97..3e50794e 100644 --- a/common/socket/ServerEvent.go +++ b/common/socket/ServerEvent.go @@ -92,6 +92,11 @@ func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) { } ws := c.Context().(*service.ClientData).Wsmsg + if ws.Tcp { //升级失败时候防止缓冲区溢出 + s.handleTcp(c) + return gnet.None + } + tt, len1 := ws.ReadBufferBytes(c) if tt == gnet.Close { @@ -99,7 +104,7 @@ func (s *Server) OnTraffic(c gnet.Conn) (action gnet.Action) { } ok, action := ws.Upgrade(c) - if !ok { + if !ok { //升级失败,说明是tcp连接 s.handleTcp(c) return gnet.None } else { diff --git a/logic/controller/CreatePlayer.go b/logic/controller/CreatePlayer.go index bb98117e..575b223a 100644 --- a/logic/controller/CreatePlayer.go +++ b/logic/controller/CreatePlayer.go @@ -7,6 +7,7 @@ import ( "blazing/logic/service/login" "blazing/logic/service/space" blservice "blazing/modules/blazing/service" + "strings" ) // 处理命令: 1001 @@ -17,18 +18,17 @@ func (h *Controller) CreatePlayer(data *login.CreatePlayerInboundInfo, c *servic } func (h *Controller) ChangePlayerName(data *login.ChangePlayerNameInboundInfo, c *service.Player) (result *login.ChangePlayerNameOutboundInfo, err errorcode.ErrorCode) { - newnice := cool.Filter.Replace(data.Nickname, '*') + newnice := cool.Filter.Replace(strings.Trim(data.Nickname, "\x00"), '*') - tt := login.ChangePlayerNameOutboundInfo{ + c.Info.Nick = newnice + result = &login.ChangePlayerNameOutboundInfo{ Nickname: newnice, UserID: c.ID(), } - c.Info.Nick = newnice + space.GetSpace(c.MapID()).Range(func(playerID uint32, player service.PlayerI) bool { - defer space.GetSpace(c.MapID()).Range(func(playerID uint32, player service.PlayerI) bool { - - player.SendPack(data.Head.Pack(&tt)) + player.SendPack(data.Head.Pack(&result)) return true }) - return result, -1 + return result, 0 } diff --git a/logic/service/maps/mapout.go b/logic/service/maps/mapout.go index 8424e422..93dc6139 100644 --- a/logic/service/maps/mapout.go +++ b/logic/service/maps/mapout.go @@ -30,6 +30,7 @@ func LeaveMap(c service.PlayerI) { space.GetSpace(c.MapID()).Range(func(playerID uint32, player service.PlayerI) bool { player.SendPack(t.Pack(&LeaveMapOutboundInfo{UserID: c.ID()})) + return true }) space.GetSpace(c.MapID()).Delete(c.ID()) diff --git a/logic/service/wscodec.go b/logic/service/wscodec.go index c975a3e5..5c984b54 100644 --- a/logic/service/wscodec.go +++ b/logic/service/wscodec.go @@ -22,6 +22,7 @@ func NewConn(c gnet.Conn) *Conn { } type WsCodec struct { + Tcp bool Upgraded bool // 链接是否升级 Buf bytes.Buffer // 从实际socket中读取到的数据缓存 wsMsgBuf wsMessageBuf // ws 消息缓存 @@ -43,6 +44,11 @@ func (w *WsCodec) Upgrade(c gnet.Conn) (ok bool, action gnet.Action) { ok = true return } + + if w.Tcp { + ok = false + return + } buf := &w.Buf tmpReader := bytes.NewReader(buf.Bytes()) oldLen := tmpReader.Len() @@ -57,6 +63,7 @@ func (w *WsCodec) Upgrade(c gnet.Conn) (ok bool, action gnet.Action) { buf.Next(skipN) logging.Errorf("conn[%v] [err=%v]", c.RemoteAddr().String(), err.Error()) action = gnet.Close + w.Tcp = true return } buf.Next(skipN)