diff --git a/server/conn.go b/server/conn.go index ab9ea72..2fd94dc 100644 --- a/server/conn.go +++ b/server/conn.go @@ -117,12 +117,13 @@ func newConn(srv *server, c net.Conn, connWriter ConnWriter) *conn { } type conn struct { - server *server // 连接所属服务器 - conn net.Conn // 连接 - writer ConnWriter // 写入器 - queue atomic.Pointer[string] // Actor 名称 - ctx context.Context // 连接上下文 - cancel context.CancelFunc // 连接上下文取消函数 + descriptor ConnDescriptor // 连接描述符 + server *server // 连接所属服务器 + conn net.Conn // 连接 + writer ConnWriter // 写入器 + queue atomic.Pointer[string] // Actor 名称 + ctx context.Context // 连接上下文 + cancel context.CancelFunc // 连接上下文取消函数 // 写分离队列相关 state int32 // 连接状态 diff --git a/server/conn_descriptor.go b/server/conn_descriptor.go new file mode 100644 index 0000000..576f2db --- /dev/null +++ b/server/conn_descriptor.go @@ -0,0 +1,29 @@ +package server + +const ( + connDescriptorInvalidReadDeadline ConnDescriptor = 1 << iota // 无效的读取截止时间 + connDescriptorInvalidWriteDeadline // 无效的写入截止时间 +) + +// ConnDescriptor 实现 BitSet 实现的连接描述符,用于标识连接部分信息 +type ConnDescriptor uint64 + +// has 判断是否包含指定的标识 +func (c *ConnDescriptor) has(flag ConnDescriptor) bool { + return *c&flag != 0 +} + +// set 设置指定的标识 +func (c *ConnDescriptor) set(flag ConnDescriptor) { + *c |= flag +} + +// SetInvalidReadDeadline 设置无效的读取截止时间 +func (c *ConnDescriptor) SetInvalidReadDeadline() { + c.set(connDescriptorInvalidReadDeadline) +} + +// SetInvalidWriteDeadline 设置无效的写入截止时间 +func (c *ConnDescriptor) SetInvalidWriteDeadline() { + c.set(connDescriptorInvalidWriteDeadline) +} diff --git a/server/controller.go b/server/controller.go index 6f21257..8e59d1a 100644 --- a/server/controller.go +++ b/server/controller.go @@ -11,7 +11,7 @@ type Controller interface { // GetServer 获取服务器 GetServer() Server // RegisterConnection 注册连接 - RegisterConnection(conn net.Conn, writer ConnWriter, callback func(conn Conn)) + RegisterConnection(conn net.Conn, writer ConnWriter, callback func(conn Conn, descriptor *ConnDescriptor)) // EliminateConnection 消除连接 EliminateConnection(conn net.Conn, err error) // ReactPacket 反应连接数据包 @@ -41,12 +41,12 @@ func (s *controller) GetAnts() *ants.Pool { return s.server.ants } -func (s *controller) RegisterConnection(conn net.Conn, writer ConnWriter, callback func(conn Conn)) { +func (s *controller) RegisterConnection(conn net.Conn, writer ConnWriter, callback func(conn Conn, descriptor *ConnDescriptor)) { s.server.PublishSyncMessage(s.getSysQueue(), func(ctx context.Context) { c := newConn(s.server, conn, writer) s.server.connections[conn] = c if callback != nil { - callback(c) + callback(c, &c.descriptor) } s.events.onConnectionOpened(c) }) diff --git a/server/network/gnet_handler.go b/server/network/gnet_handler.go index 179169e..04b068c 100644 --- a/server/network/gnet_handler.go +++ b/server/network/gnet_handler.go @@ -31,8 +31,10 @@ func (t *gNetGenericHandler) OnOpen(c gnet.Conn) (out []byte, action gnet.Action t.controller.OnConnectionAsyncWriteError(c.Context().(server.Conn), packet, err) return nil }) - }, func(conn server.Conn) { + }, func(conn server.Conn, descriptor *server.ConnDescriptor) { c.SetContext(conn) + descriptor.SetInvalidWriteDeadline() + descriptor.SetInvalidReadDeadline() }) return } diff --git a/server/network/kcp.go b/server/network/kcp.go index a3b3d2f..08b67cc 100644 --- a/server/network/kcp.go +++ b/server/network/kcp.go @@ -62,7 +62,7 @@ func (k *kcpCore) OnRun() error { k.controller.OnConnectionAsyncWriteError(srvConn, packet, err) } return - }, func(conn server.Conn) { + }, func(conn server.Conn, descriptor *server.ConnDescriptor) { srvConn = conn }, ) diff --git a/server/network/websocket.go b/server/network/websocket.go index 0264979..24980e0 100644 --- a/server/network/websocket.go +++ b/server/network/websocket.go @@ -51,7 +51,10 @@ func (w *websocketHandler) OnTraffic(c gnet.Conn) (action gnet.Action) { // 协议升级成功后视为连接建立 w.controller.RegisterConnection(c, func(packet server.Packet) error { return wsutil.WriteServerMessage(c, packet.GetContext().(ws.OpCode), packet.GetBytes()) - }, nil) + }, func(conn server.Conn, descriptor *server.ConnDescriptor) { + descriptor.SetInvalidWriteDeadline() + descriptor.SetInvalidReadDeadline() + }) }); err != nil { return gnet.Close }