From 173dd11d4dfb69132ed9923cbcae6e8fd11ade9e Mon Sep 17 00:00:00 2001 From: kercylan98 Date: Tue, 28 Nov 2023 09:32:53 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20server.Server=20=E9=BB=98=E8=AE=A4?= =?UTF-8?q?=E5=BC=80=E5=90=AF=E6=95=B0=E6=8D=AE=E5=8C=85=E5=A4=A7=E5=B0=8F?= =?UTF-8?q?=E8=AD=A6=E5=91=8A=EF=BC=8C=E5=8F=AF=E9=80=9A=E8=BF=87=20server?= =?UTF-8?q?.WithPacketWarnSize=20=E5=85=B3=E9=97=AD=E6=88=96=E8=B0=83?= =?UTF-8?q?=E6=95=B4=E8=AD=A6=E5=91=8A=E5=A4=A7=E5=B0=8F=EF=BC=8C=E9=BB=98?= =?UTF-8?q?=E8=AE=A4=E4=B8=BA=201MB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- server/conn.go | 3 +++ server/constants.go | 1 + server/event.go | 3 +++ server/options.go | 15 +++++++++++++++ 4 files changed, 22 insertions(+) diff --git a/server/conn.go b/server/conn.go index e474faf..1806047 100644 --- a/server/conn.go +++ b/server/conn.go @@ -296,6 +296,9 @@ func (slf *Conn) init() { }, ) slf.loop = writeloop.NewWriteLoop[*connPacket](slf.pool, func(data *connPacket) error { + if slf.server.runtime.packetWarnSize > 0 && len(data.packet) > slf.server.runtime.packetWarnSize { + log.Warn("Conn.Write", log.String("State", "PacketWarn"), log.String("Reason", "PacketSize"), log.String("ID", slf.GetID()), log.Int("PacketSize", len(data.packet))) + } var err error if slf.delay > 0 || slf.fluctuation > 0 { time.Sleep(random.Duration(int64(slf.delay-slf.fluctuation), int64(slf.delay+slf.fluctuation))) diff --git a/server/constants.go b/server/constants.go index e02720a..888dc8b 100644 --- a/server/constants.go +++ b/server/constants.go @@ -25,6 +25,7 @@ const ( DefaultMessageBufferSize = 1024 DefaultAsyncPoolSize = 256 DefaultWebsocketReadDeadline = 30 * time.Second + DefaultPacketWarnSize = 1024 * 1024 * 1 // 1MB ) const ( diff --git a/server/event.go b/server/event.go index 5244ffa..c3c390d 100644 --- a/server/event.go +++ b/server/event.go @@ -239,6 +239,9 @@ func (slf *event) RegConnectionReceivePacketEvent(handle ConnectionReceivePacket } func (slf *event) OnConnectionReceivePacketEvent(conn *Conn, packet []byte) { + if slf.Server.runtime.packetWarnSize > 0 && len(packet) > slf.Server.runtime.packetWarnSize { + log.Warn("Server", log.String("OnConnectionReceivePacketEvent", fmt.Sprintf("packet size %d > %d", len(packet), slf.Server.runtime.packetWarnSize))) + } slf.connectionReceivePacketEventHandles.RangeValue(func(index int, value ConnectionReceivePacketEventHandle) bool { value(slf.Server, conn, packet) return true diff --git a/server/options.go b/server/options.go index 0dc122e..53a1def 100644 --- a/server/options.go +++ b/server/options.go @@ -41,6 +41,21 @@ type runtime struct { websocketWriteCompression bool // websocket写入压缩 limitLife time.Duration // 限制最大生命周期 shuntMatcher func(conn *Conn) string // 分流匹配器 + packetWarnSize int // 数据包大小警告 +} + +// WithPacketWarnSize 通过数据包大小警告的方式创建服务器,当数据包大小超过指定大小时,将会输出 WARN 类型的日志 +// - 默认值为 DefaultPacketWarnSize +// - 当 size <= 0 时,表示不设置警告 +func WithPacketWarnSize(size int) Option { + return func(srv *Server) { + if size <= 0 { + srv.packetWarnSize = 0 + log.Info("WithPacketWarnSize", log.String("State", "Ignore"), log.String("Reason", "size <= 0")) + return + } + srv.packetWarnSize = size + } } // WithShunt 通过连接数据包分流的方式创建服务器