//go:build windows package yu_hpsocket import yu_sys "gogs.qqck.cn/s/tools/sys" // Server // @Description: Server 系列组件底层实现 type Server[T any] struct { hListener uintptr hServer uintptr SSL bool Extra any // 附加数据 // 事件---------------------------------- onPrepareListen func(t *T, Sender, Listen uintptr) HR onAccept func(t *T, Sender, ConnID, Client uintptr) HR onHandShake func(t *T, Sender, ConnID uintptr) HR onSend func(t *T, Sender, ConnID, Data uintptr, Length uintptr) HR onReceive func(t *T, Sender, ConnID, Data uintptr, Length uintptr) HR onClose func(t *T, Sender, ConnID uintptr, Operation SO, ErrorCode int) HR onShutdown func(t *T, Sender uintptr) HR } // isValid // // @Description: 对象是否有效 func (t *Server[T]) isValid() bool { return t.hListener != 0 && t.hServer != 0 } // Start 名称:启动通信组件 // // @Description: 启动服务端通信组件,启动完成后可开始接收客户端连接并收发数据 // @param BindAddress 监听地址 // @param Port 监听端口 // @return bool 是否启动成功 func (t *Server[T]) Start(BindAddress string, Port int) bool { if !t.isValid() { return false } return HP_Server_Start.CallBool(t.hServer, yu_sys.S{yu_sys.Gbk, BindAddress}, Port) } // Stop 名称:关闭通信组件 // // @Description: 关闭服务端通信组件,关闭完成后断开所有客户端连接并释放所有资源 // @return bool 是否成功关闭 func (t *Server[T]) Stop() bool { if !t.isValid() { return false } return HP_Server_Stop.CallBool(t.hServer) } // Wait // // @Description: 等待通信组件停止运行 // @param Milliseconds 超时时间(毫秒,默认:-1,永不超时) // @return bool 超时返回 false func (t *Server[T]) Wait(Milliseconds int) bool { if !t.isValid() { return false } return HP_Server_Wait.CallBool(t.hServer, Milliseconds) } // Send // // @Description: 向指定连接发送数据 // @param ConnID 连接 ID // @param buf 欲发送的数据 // @return bool 是否发送成功 func (t *Server[T]) Send(ConnID uintptr, buf []byte) bool { if !t.isValid() { return false } if len(buf) == 0 { return true } return HP_Server_Send.CallBool(t.hServer, ConnID, buf, len(buf)) } // SendS // // @Description: 向指定连接发送数据 // @param ConnID 连接 ID // @param buf 欲发送的数据 // @return bool 是否发送成功 func (t *Server[T]) SendS(ConnID uintptr, buf string) bool { if !t.isValid() { return false } if len(buf) == 0 { return true } return HP_Server_Send.CallBool(t.hServer, ConnID, buf, len(buf)) } // IsSecure // // @Description: 检测是否为安全连接(SSL/HTTPS) func (t *Server[T]) IsSecure() bool { if !t.isValid() { return false } return HP_Server_IsSecure.CallBool(t.hServer) } // Disconnect // // @Description: 断开与某个客户端的连接 // @param Force 是否强制断开连接 func (t *Server[T]) Disconnect(ConnID uintptr, Force bool) bool { if !t.isValid() { return false } return HP_Server_Disconnect.CallBool(t.hServer, ConnID, Force) } // DisconnectLongConnections // // @Description: 断开超过指定时长的连接 // @param Period 时长(毫秒) // @param Force 是否强制断开连接 func (t *Server[T]) DisconnectLongConnections(Period uintptr, Force bool) bool { if !t.isValid() { return false } return HP_Server_DisconnectLongConnections.CallBool(t.hServer, Period, Force) } // DisconnectSilenceConnections // // @Description: 断开静默连接 // @param Period 时长(毫秒) // @param Force 是否强制断开连接 func (t *Server[T]) DisconnectSilenceConnections(Period uintptr, Force bool) bool { if !t.isValid() { return false } return HP_Server_DisconnectSilenceConnections.CallBool(t.hServer, Period, Force) } // SetExtra // // @Description: 设置连接的附加数据 // @param ConnID 连接 ID // @param Extra 附加数据 func (t *Server[T]) SetExtra(ConnID, Extra uintptr) (success bool) { if !t.isValid() { return } return HP_Server_SetConnectionExtra.CallBool(t.hServer, ConnID, Extra) } // GetExtra // // @Description: 获取连接的附加数据 // @param ConnID 连接 ID func (t *Server[T]) GetExtra(ConnID uintptr) (Extra uintptr) { if !t.isValid() { return } HP_Server_GetConnectionExtra.Call(t.hServer, ConnID, &Extra) return } // HasStarted // // @Description: 检查通信组件是否已启动 func (t *Server[T]) HasStarted() bool { if !t.isValid() { return false } return HP_Server_HasStarted.CallBool(t.hServer) } // GetState // // @Description: 查看通信组件当前状态,SS_ 开头常量 func (t *Server[T]) GetState() SS { if !t.isValid() { return SS_STOPPED } return SS(HP_Server_GetState.CallUintptr(t.hServer)) } // GetLastError // // @Description: 获取最近一次失败操作的错误代码 func (t *Server[T]) GetLastError() uintptr { if !t.isValid() { return 0 } return HP_Server_GetLastError.CallUintptr(t.hServer) } // GetLastErrorDesc // // @Description: 获取最近一次失败操作的错误描述 func (t *Server[T]) GetLastErrorDesc() string { if !t.isValid() { return "Not Object" } return HP_Server_GetLastErrorDesc.CallGbkToUtf8(t.hServer) } // GetPendingDataLength // // @Description: 获取连接中未发出数据的长度 // @param ConnID 连接 ID func (t *Server[T]) GetPendingDataLength(ConnID uintptr) (Pending int) { if !t.isValid() { return } HP_Server_GetPendingDataLength.Call(t.hServer, ConnID, &Pending) return } // GetConnectionCount // // @Description: 获取客户端连接数 func (t *Server[T]) GetConnectionCount() int { if !t.isValid() { return 0 } return HP_Server_GetConnectionCount.CallInt(t.hServer) } // GetAllConnectionIDs // // @Description: 获取所有连接的 HP_CONNID // @return IDs func (t *Server[T]) GetAllConnectionIDs() (IDs []uintptr) { if !t.isValid() { return } var j_count uintptr HP_Server_GetAllConnectionIDs.Call(t.hServer, 0, &j_count) if j_count == 0 { return } IDs = make([]uintptr, j_count) HP_Server_GetAllConnectionIDs.Call(t.hServer, IDs, &j_count) return } // GetConnectPeriod // // @Description: 获取某个客户端连接时长(毫秒) // @param ConnID 连接 ID func (t *Server[T]) GetConnectPeriod(ConnID uintptr) (Pending int) { if !t.isValid() { return } HP_Server_GetConnectPeriod.Call(t.hServer, ConnID, &Pending) return } // GetSilencePeriod // // @Description: 获取某个连接静默时间(毫秒) // @param ConnID 连接 ID func (t *Server[T]) GetSilencePeriod(ConnID uintptr) (Period int) { if !t.isValid() { return } HP_Server_GetSilencePeriod.Call(t.hServer, ConnID, &Period) return } // GetListenAddress // // @Description: 获取监听 Socket 的地址信息 func (t *Server[T]) GetListenAddress() (address string, port int) { if !t.isValid() { return } j_address_len := 128 j_address := make([]byte, 64) if !HP_Server_GetListenAddress.CallBool(t.hServer, j_address, &j_address_len, &port) { return } j_address_len -= 1 // 有结束符 {0} j_unicode_len := j_address_len * 2 j_unicode := make([]byte, j_unicode_len) yu_sys.MultiByteToWideChar.Call(936, 0, j_address, j_address_len, j_unicode, j_unicode_len) j_utf8_size := j_unicode_len * 2 j_utf8 := make([]byte, j_utf8_size) address = string(j_utf8[:yu_sys.WideCharToMultiByte.CallInt(65001, 0, j_unicode, j_address_len, j_utf8, j_utf8_size, 0, 0)]) return } // GetLocalAddress // // @Description: 获取某个连接的本地地址信息 // @param ConnID 连接 ID func (t *Server[T]) GetLocalAddress(ConnID uintptr) (address string, port int) { if !t.isValid() { return } j_address_len := 128 j_address := make([]byte, 64) if !HP_Server_GetLocalAddress.CallBool(t.hServer, ConnID, j_address, &j_address_len, &port) { return } j_address_len -= 1 // 有结束符 {0} j_unicode_len := j_address_len * 2 j_unicode := make([]byte, j_unicode_len) yu_sys.MultiByteToWideChar.Call(936, 0, j_address, j_address_len, j_unicode, j_unicode_len) j_utf8_size := j_unicode_len * 2 j_utf8 := make([]byte, j_utf8_size) address = string(j_utf8[:yu_sys.WideCharToMultiByte.CallInt(65001, 0, j_unicode, j_address_len, j_utf8, j_utf8_size, 0, 0)]) return } // GetRemoteAddress // // @Description: 获取某个连接的远程地址信息 // @param ConnID 连接 ID func (t *Server[T]) GetRemoteAddress(ConnID uintptr) (address string, port int) { if !t.isValid() { return } j_address_len := 128 j_address := make([]byte, 64) if !HP_Server_GetRemoteAddress.CallBool(t.hServer, ConnID, j_address, &j_address_len, &port) { return } j_address_len -= 1 // 有结束符 {0} j_unicode_len := j_address_len * 2 j_unicode := make([]byte, j_unicode_len) yu_sys.MultiByteToWideChar.Call(936, 0, j_address, j_address_len, j_unicode, j_unicode_len) j_utf8_size := j_unicode_len * 2 j_utf8 := make([]byte, j_utf8_size) address = string(j_utf8[:yu_sys.WideCharToMultiByte.CallInt(65001, 0, j_unicode, j_address_len, j_utf8, j_utf8_size, 0, 0)]) return } // SetSendPolicy // // @Description: 设置数据发送策略 // @param SendPolicy SP_ 开头常量 func (t *Server[T]) SetSendPolicy(SendPolicy SP) *Server[T] { if !t.isValid() { return t } HP_Server_SetSendPolicy.Call(t.hServer, uintptr(SendPolicy)) return t } // SetOnSendSyncPolicy // // @Description: 设置 OnSend 事件同步策略(默认:OSSP_NONE,不同步) // @param SyncPolicy OSSP_ 开头常量 func (t *Server[T]) SetOnSendSyncPolicy(SyncPolicy OSSP) *Server[T] { if !t.isValid() { return t } HP_Server_SetOnSendSyncPolicy.Call(t.hServer, uintptr(SyncPolicy)) return t } // SetFreeSocketObjLockTime // // @Description: 设置 Socket 缓存对象锁定时间(毫秒,在锁定期间该 Socket 缓存对象不能被获取使用) func (t *Server[T]) SetFreeSocketObjLockTime(FreeSocketObjLockTime int) *Server[T] { if !t.isValid() { return t } HP_Server_SetFreeSocketObjLockTime.Call(t.hServer, FreeSocketObjLockTime) return t } // SetFreeSocketObjPool // // @Description: 设置 Socket 缓存池大小(通常设置为平均并发连接数量的 1/3 - 1/2) func (t *Server[T]) SetFreeSocketObjPool(FreeSocketObjPool int) *Server[T] { if !t.isValid() { return t } HP_Server_SetFreeSocketObjPool.Call(t.hServer, FreeSocketObjPool) return t } // SetFreeBufferObjPool // // @Description: 设置内存块缓存池大小(通常设置为 Socket 缓存池大小的 2 - 3 倍) func (t *Server[T]) SetFreeBufferObjPool(FreeBufferObjPool int) *Server[T] { if !t.isValid() { return t } HP_Server_SetFreeBufferObjPool.Call(t.hServer, FreeBufferObjPool) return t } // SetFreeSocketObjHold // // @Description: 设置 Socket 缓存池回收阀值(通常设置为 Socket 缓存池大小的 3 倍) func (t *Server[T]) SetFreeSocketObjHold(FreeSocketObjHold int) *Server[T] { if !t.isValid() { return t } HP_Server_SetFreeSocketObjHold.Call(t.hServer, FreeSocketObjHold) return t } // SetFreeBufferObjHold // // @Description: 设置内存块缓存池回收阀值(通常设置为内存块缓存池大小的 3 倍) func (t *Server[T]) SetFreeBufferObjHold(FreeBufferObjHold int) *Server[T] { if !t.isValid() { return t } HP_Server_SetFreeBufferObjHold.Call(t.hServer, FreeBufferObjHold) return t } // SetMaxConnectionCount // // @Description: 设置最大连接数(组件会根据设置值预分配内存,因此需要根据实际情况设置,不宜过大) func (t *Server[T]) SetMaxConnectionCount(MaxConnectionCount int) *Server[T] { if !t.isValid() { return t } HP_Server_SetMaxConnectionCount.Call(t.hServer, MaxConnectionCount) return t } // SetWorkerThreadCount // // @Description: 设置工作线程数量(通常设置为 2 * CPU + 2) func (t *Server[T]) SetWorkerThreadCount(WorkerThreadCount int) *Server[T] { if !t.isValid() { return t } HP_Server_SetWorkerThreadCount.Call(t.hServer, WorkerThreadCount) return t } // SetMarkSilence // // @Description: 设置是否标记静默时间(设置为 TRUE 时 DisconnectSilenceConnections() 和 GetSilencePeriod() 才有效,默认:TRUE) func (t *Server[T]) SetMarkSilence(MarkSilence bool) *Server[T] { if !t.isValid() { return t } HP_Server_SetMarkSilence.Call(t.hServer, MarkSilence) return t } // GetSendPolicy // // @Description: 获取数据发送策略 func (t *Server[T]) GetSendPolicy() SP { if !t.isValid() { return 0 } return SP(HP_Server_GetSendPolicy.CallUintptr(t.hServer)) } // GetOnSendSyncPolicy // // @Description: 获取 OnSend 事件同步策略,返回 OSSP_ 开头常量 func (t *Server[T]) GetOnSendSyncPolicy() OSSP { if !t.isValid() { return 0 } return OSSP(HP_Server_GetOnSendSyncPolicy.CallUintptr(t.hServer)) } // GetFreeSocketObjLockTime // // @Description: 获取 Socket 缓存对象锁定时间 func (t *Server[T]) GetFreeSocketObjLockTime() int { if !t.isValid() { return 0 } return HP_Server_GetFreeSocketObjLockTime.CallInt(t.hServer) } // GetFreeSocketObjPool // // @Description: 获取 Socket 缓存池大小 func (t *Server[T]) GetFreeSocketObjPool() int { if !t.isValid() { return 0 } return HP_Server_GetFreeSocketObjPool.CallInt(t.hServer) } // GetFreeBufferObjPool // // @Description: 获取内存块缓存池大小 func (t *Server[T]) GetFreeBufferObjPool() int { if !t.isValid() { return 0 } return HP_Server_GetFreeBufferObjPool.CallInt(t.hServer) } // GetFreeSocketObjHold // // @Description: 获取 Socket 缓存池回收阀值 func (t *Server[T]) GetFreeSocketObjHold() int { if !t.isValid() { return 0 } return HP_Server_GetFreeSocketObjHold.CallInt(t.hServer) } // GetFreeBufferObjHold // // @Description: 获取内存块缓存池回收阀值 func (t *Server[T]) GetFreeBufferObjHold() int { if !t.isValid() { return 0 } return HP_Server_GetFreeBufferObjHold.CallInt(t.hServer) } // GetMaxConnectionCount // // @Description: 获取最大连接数 func (t *Server[T]) GetMaxConnectionCount() int { if !t.isValid() { return 0 } return HP_Server_GetMaxConnectionCount.CallInt(t.hServer) } // GetWorkerThreadCount // // @Description: 获取工作线程数量 func (t *Server[T]) GetWorkerThreadCount() int { if !t.isValid() { return 0 } return HP_Server_GetWorkerThreadCount.CallInt(t.hServer) } // IsMarkSilence // // @Description: 检测是否标记静默时间 func (t *Server[T]) IsMarkSilence() bool { if !t.isValid() { return false } return HP_Server_IsMarkSilence.CallBool(t.hServer) } // SetupSSLContext // // @Description: 初始化通信组件SSL环境参数 必须在 SSL 通信组件启动前完成初始化,否则启动失败 // @param VerifyMode SSL_VM_ 开头常量, SSL验证模式 // @param PemCertFile 证书文件 // @param PemKeyFile 私钥文件 // @param KeyPasswod 私钥密码(没有密码则为空) // @param CAPemCertFileOrPath CA 证书文件或目录(单向验证或客户端可选) func (t *Server[T]) SetupSSLContext(VerifyMode SSL_VM, PemCertFile, PemKeyFile, KeyPasswod, CAPemCertFileOrPath string) bool { if !t.isValid() { return false } return HP_SSLServer_SetupSSLContext.CallBool(t.hServer, uintptr(VerifyMode), yu_sys.S{yu_sys.Gbk, PemCertFile}, yu_sys.S{yu_sys.Gbk, PemKeyFile}, yu_sys.S{yu_sys.Gbk, KeyPasswod}, yu_sys.S{yu_sys.Gbk, CAPemCertFileOrPath}, 0, // fnServerNameCallback SNI 回调函数指针(可选)int (__HP_CALL *Fn_SNI_ServerNameCallback)(LPCTSTR lpszServerName, PVOID pContext) ) } // SetupSSLContextByMemory 名称: // // @Description: 初始化通信组件SSL环境参数 必须在SSL通信组件启动前完成初始化,否则启动失败 // @param VerifyMode SSL_VM_ 开头常量, SSL验证模式 // @param PemCert 证书内容 // @param PemKey 私钥内容 // @param KeyPasswod 私钥密码(没有密码则为空) // @param CAPemCert CA 证书内容(单向验证可选) func (t *Server[T]) SetupSSLContextByMemory(VerifyMode SSL_VM, PemCert, PemKey, KeyPasswod, CAPemCert string) bool { if !t.isValid() { return false } return HP_SSLServer_SetupSSLContextByMemory.CallBool(t.hServer, uintptr(VerifyMode), yu_sys.S{yu_sys.Gbk, PemCert}, yu_sys.S{yu_sys.Gbk, PemKey}, yu_sys.S{yu_sys.Gbk, KeyPasswod}, yu_sys.S{yu_sys.Gbk, CAPemCert}, 0, // fnServerNameCallback SNI 回调函数指针(可选)int (__HP_CALL *Fn_SNI_ServerNameCallback)(LPCTSTR lpszServerName, PVOID pContext) ) } // AddSSLContext 名称:增加 SNI 主机证书 // // @Description: 增加 SNI 主机证书 SSL服务端在 SetupSSLContext() 成功后可以调用本方法增加多个 SNI 主机证书,正数-成功,并返回 SNI 主机证书对应的索引,该索引用于在 SNI 回调函数中定位 SNI 主机,负数-失败 // @param VerifyMode SSL_VM_ 开头常量, SSL验证模式 // @param PemCertFile 证书文件 // @param PemKeyFile 私钥文件 // @param KeyPasswod 私钥密码(没有密码则为空) // @param CAPemCertFileOrPath CA 证书文件或目录(单向验证或客户端可选) func (t *Server[T]) AddSSLContext(VerifyMode SSL_VM, PemCertFile, PemKeyFile, KeyPasswod, CAPemCertFileOrPath string) int { if !t.isValid() { return -1 } return HP_SSLServer_AddSSLContext.CallInt(t.hServer, uintptr(VerifyMode), yu_sys.S{yu_sys.Gbk, PemCertFile}, yu_sys.S{yu_sys.Gbk, PemKeyFile}, yu_sys.S{yu_sys.Gbk, KeyPasswod}, yu_sys.S{yu_sys.Gbk, CAPemCertFileOrPath}, ) } // AddSSLContextByMemory 名称:增加 SNI 主机证书 // // @Description: 增加 SNI 主机证书 SSL服务端在 SetupSSLContext() 成功后可以调用本方法增加多个 SNI 主机证书,正数-成功,并返回 SNI 主机证书对应的索引,该索引用于在 SNI 回调函数中定位 SNI 主机,负数-失败 // @param VerifyMode SSL_VM_ 开头常量, SSL验证模式 // @param PemCert 证书文件 // @param PemKey 私钥文件 // @param KeyPasswod 私钥密码(没有密码则为空) // @param CAPemCert CA 证书内容(单向验证可选) func (t *Server[T]) AddSSLContextByMemory(VerifyMode SSL_VM, PemCert, PemKey, KeyPasswod, CAPemCert string) int { if !t.isValid() { return -1 } return HP_SSLServer_AddSSLContextByMemory.CallInt(t.hServer, uintptr(VerifyMode), yu_sys.S{yu_sys.Gbk, PemCert}, yu_sys.S{yu_sys.Gbk, PemKey}, yu_sys.S{yu_sys.Gbk, KeyPasswod}, yu_sys.S{yu_sys.Gbk, CAPemCert}, ) } // BindSSLServerName 名称:绑定 SNI 主机域名 // // @Description: 绑定 SNI 主机域名 SSL服务端在 AddSSLContext() 成功后可以调用本方法绑定主机域名到 SNI 主机证书 // @param DomainName 主机域名 // @param ContextIndex SNI 主机证书对应的索引 func (t *Server[T]) BindSSLServerName(DomainName string, ContextIndex uintptr) bool { if !t.isValid() { return false } return HP_SSLServer_BindSSLServerName.CallBool(t.hServer, yu_sys.S{yu_sys.Gbk, DomainName}, ContextIndex) } // StartSSLHandShake // // @Description: 启动 SSL 握手,当通信组件设置为非自动握手时,需要调用本方法启动 SSL 握手 // @param ConnID 连接 ID func (t *Server[T]) StartSSLHandShake(ConnID uintptr) bool { if !t.isValid() { return false } return HP_SSLServer_StartSSLHandShake.CallBool(t.hServer, ConnID) } // SetSSLAutoHandShake // // @Description: 设置通信组件握手方式(默认:真,自动握手) func (t *Server[T]) SetSSLAutoHandShake(AutoHandShake bool) *Server[T] { if !t.isValid() { return t } HP_SSLServer_SetSSLAutoHandShake.Call(t.hServer, AutoHandShake) return t } // IsSSLAutoHandShake // // @Description: 获取通信组件握手方式 func (t *Server[T]) IsSSLAutoHandShake() bool { if !t.isValid() { return false } return HP_SSLServer_IsSSLAutoHandShake.CallBool(t.hServer) } // SetSSLCipherList // // @Description: 设置 SSL加密算法列表 func (t *Server[T]) SetSSLCipherList(CipherList string) *Server[T] { if !t.isValid() { return t } HP_SSLServer_SetSSLCipherList.Call(t.hServer, yu_sys.S{yu_sys.Gbk, CipherList}) return t } // GetSSLCipherList // // @Description: 获取 SSL加密算法列表 func (t *Server[T]) GetSSLCipherList() string { if !t.isValid() { return "" } return HP_SSLServer_GetSSLCipherList.CallGbkToUtf8(t.hServer) } // GetSSLSessionInfo 名称: // // @Description: 获取指定类型的 SSLSession 信息(输出类型参考:SSL_SSI_) // @param info SSL_SSI_ 开头常量 func (t *Server[T]) GetSSLSessionInfo(info SSL_SSI) (Info uintptr) { if !t.isValid() { return } HP_SSLServer_GetSSLSessionInfo.Call(t.hServer, uintptr(info), &Info) return } // IsPauseReceive // // @Description: 获取连接的数据接收状态 // @param ConnID 连接 ID func (t *Server[T]) IsPauseReceive(ConnID uintptr) (Paused bool) { if !t.isValid() { return } HP_Server_IsPauseReceive.Call(t.hServer, ConnID, &Paused) return } // IsConnected // // @Description: 检测是否有效连接 // @param ConnID 连接 ID func (t *Server[T]) IsConnected(ConnID uintptr) bool { if !t.isValid() { return false } return HP_Server_IsConnected.CallBool(t.hServer, ConnID) } // PauseReceive // // @Description: 暂停/恢复某个连接的数据接收工作 // @param ConnID 连接 ID func (t *Server[T]) PauseReceive(ConnID uintptr, Paused bool) bool { if !t.isValid() { return false } return HP_Server_PauseReceive.CallBool(t.hServer, ConnID, Paused) } // CleanupSSLContext // // @Description: 清理通信组件 SSL运行环境,回收 SSL相关内存,无,/当要重新设置通信组件 SSL环境参数时,需要先调用本方法清理原先的环境参数 func (t *Server[T]) CleanupSSLContext() *Server[T] { if !t.isValid() { return t } HP_SSLServer_CleanupSSLContext.Call(t.hServer) return t } // OnPrepareListen // // @Description: 【可选】绑定准备监听事件 // @param call->return HR_ 开头常量 func (t *Server[T]) OnPrepareListen(call func(t *T, Sender, Listen uintptr) HR) *Server[T] { if !t.isValid() { return t } if call == nil { HP_Set_FN_Server_OnPrepareListen.Call(t.hListener, 0) } else { t.onPrepareListen = call HP_Set_FN_Server_OnPrepareListen.Call(t.hListener, server_callback_OnPrepareListen_ptr) } return t } // OnAccept // // @Description: 【可选】绑定接受事件 // @param call->return HR_ 开头常量 func (t *Server[T]) OnAccept(call func(t *T, Sender, ConnID, Client uintptr) HR) *Server[T] { if !t.isValid() { return t } if call == nil { HP_Set_FN_Server_OnAccept.Call(t.hListener, 0) } else { t.onAccept = call HP_Set_FN_Server_OnAccept.Call(t.hListener, server_callback_OnAccept_ptr) } return t } // OnHandShake // // @Description: 【可选】绑定握手事件 // @param call->return HR_ 开头常量 func (t *Server[T]) OnHandShake(call func(t *T, Sender, ConnID uintptr) HR) *Server[T] { if !t.isValid() { return t } if call == nil { HP_Set_FN_Server_OnHandShake.Call(t.hListener, 0) } else { t.onHandShake = call HP_Set_FN_Server_OnHandShake.Call(t.hListener, server_callback_OnHandShake_ptr) } return t } // OnSend // // @Description: 【可选】绑定发送事件 // @param call->return HR_ 开头常量 func (t *Server[T]) OnSend(call func(t *T, Sender, ConnID, Data uintptr, Length uintptr) HR) *Server[T] { if !t.isValid() { return t } if call == nil { HP_Set_FN_Server_OnSend.Call(t.hListener, 0) } else { t.onSend = call HP_Set_FN_Server_OnSend.Call(t.hListener, server_callback_OnSend_ptr) } return t } // OnReceive // // @Description: 【必选】绑定数据接收事件 // @param call->return HR_ 开头常量 func (t *Server[T]) OnReceive(call func(t *T, Sender, ConnID, Data uintptr, Length uintptr) HR) *Server[T] { if !t.isValid() { return t } if call == nil { HP_Set_FN_Server_OnReceive.Call(t.hListener, 0) } else { t.onReceive = call HP_Set_FN_Server_OnReceive.Call(t.hListener, server_callback_OnReceive_ptr) } return t } // OnClose // // @Description: 【必选】绑定断开事件 // @param call->Operation 通过该参数标识是哪种操作导致的错误 SO_ 开头常量 // @param call->return HR_ 开头常量 func (t *Server[T]) OnClose(call func(t *T, Sender, ConnID uintptr, Operation SO, ErrorCode int) HR) *Server[T] { if !t.isValid() { return t } if call == nil { HP_Set_FN_Server_OnClose.Call(t.hListener, 0) } else { t.onClose = call HP_Set_FN_Server_OnClose.Call(t.hListener, server_callback_OnClose_ptr) } return t } // OnShutdown // // @Description: 【可选】绑定关闭事件 // @param call->return HR_ 开头常量 func (t *Server[T]) OnShutdown(call func(t *T, Sender uintptr) HR) *Server[T] { if !t.isValid() { return t } if call == nil { HP_Set_FN_Server_OnShutdown.Call(t.hListener, 0) } else { t.onShutdown = call HP_Set_FN_Server_OnShutdown.Call(t.hListener, server_callback_OnShutdown_ptr) } return t } // OnDefault // // @Description: 【可选】绑定所有【必选】事件 func (t *Server[T]) OnDefault() *Server[T] { if !t.isValid() { return t } if t.onReceive == nil { t.OnReceive(func(t *T, Sender, ConnID, Data uintptr, Length uintptr) HR { return HR_OK }) } if t.onClose == nil { t.OnClose(func(t *T, Sender, ConnID uintptr, Operation SO, ErrorCode int) HR { return HR_OK }) } return t }