diff --git a/Makefile b/Makefile index dfe9955b..eeaf394c 100644 --- a/Makefile +++ b/Makefile @@ -106,9 +106,9 @@ gen_proto: gen_client_proto: cd gate/client_proto && \ rm -rf client_proto_gen.go && \ + go test -count=1 -v -run TestClientProtoGen . && \ rm -rf proto/*.pb.go && \ - find proto -name '*.proto' | xargs -n 1000 protoc --proto_path=proto --go_out=proto && \ - go test -count=1 -v -run TestClientProtoGen . + find proto -name '*.proto' | xargs -n 1000 protoc --proto_path=proto --go_out=proto .PHONY: test test: diff --git a/gate/client_proto/client_proto_gen_test.go b/gate/client_proto/client_proto_gen_test.go index 221f87d7..90afd4f3 100644 --- a/gate/client_proto/client_proto_gen_test.go +++ b/gate/client_proto/client_proto_gen_test.go @@ -79,7 +79,7 @@ func (c *ClientCmdProtoMap) GetClientProtoObjByName(protoObjName string) any { } } `) - err = os.WriteFile("./client_proto_gen.go", []byte(fileDataBuffer.String()), 0644) + err = os.WriteFile("./client_proto_gen.go", fileDataBuffer.Bytes(), 0644) if err != nil { panic(err) } diff --git a/gate/net/kcp_connect_manager.go b/gate/net/kcp_connect_manager.go index 13290878..9edb9f33 100644 --- a/gate/net/kcp_connect_manager.go +++ b/gate/net/kcp_connect_manager.go @@ -5,6 +5,7 @@ import ( "context" "encoding/binary" "strconv" + "strings" "sync" "sync/atomic" "time" @@ -96,7 +97,13 @@ func (k *KcpConnectManager) run() { } regionEc2b := random.NewEc2b() regionEc2b.SetSeed(ec2b.Seed()) - k.dispatchKey = regionEc2b.XorKey() + // 3.7的时候修改了xor 首包无需使用加密密钥 + if k.getGateMaxVersion() < 3.7 { + k.dispatchKey = regionEc2b.XorKey() + } else { + // 全部填充为0 不然会出问题 + k.dispatchKey = make([]byte, 4096) + } // kcp port := strconv.Itoa(int(config.GetConfig().Hk4e.KcpPort)) listener, err := kcp.ListenWithOptions("0.0.0.0:" + port) @@ -117,6 +124,22 @@ func (k *KcpConnectManager) Close() { k.closeAllKcpConn() } +// getGateMaxVersion 获取gate最大可兼容的版本 +func (k *KcpConnectManager) getGateMaxVersion() (maxVersion float64) { + versionSplit := strings.Split(config.GetConfig().Hk4e.Version, ",") + for _, verStr := range versionSplit { + version, err := strconv.ParseFloat(verStr, 64) + if err != nil { + logger.Error("version a to i error: %v", err) + return + } + if version > maxVersion { + maxVersion = version + } + } + return +} + func (k *KcpConnectManager) gateNetInfo() { ticker := time.NewTicker(time.Second * 60) kcpErrorCount := uint64(0) @@ -313,7 +336,7 @@ func (k *KcpConnectManager) recvHandle(session *Session) { } recvData := recvBuf[:recvLen] kcpMsgList := make([]*KcpMsg, 0) - DecodeBinToPayload(recvData, convId, &kcpMsgList, session.xorKey) + DecodeBinToPayload(recvData, session, &kcpMsgList, session.xorKey) for _, v := range kcpMsgList { protoMsgList := ProtoDecode(v, k.serverCmdProtoMap, k.clientCmdProtoMap) for _, vv := range protoMsgList { diff --git a/gate/net/kcp_endecode.go b/gate/net/kcp_endecode.go index e6e26c77..d793091a 100644 --- a/gate/net/kcp_endecode.go +++ b/gate/net/kcp_endecode.go @@ -2,7 +2,6 @@ package net import ( "encoding/binary" - "hk4e/pkg/endec" "hk4e/pkg/logger" ) @@ -32,10 +31,11 @@ type KcpMsg struct { ProtoData []byte } -func DecodeBinToPayload(data []byte, convId uint64, kcpMsgList *[]*KcpMsg, xorKey []byte) { +func DecodeBinToPayload(data []byte, session *Session, kcpMsgList *[]*KcpMsg, xorKey []byte) { // xor解密 endec.Xor(data, xorKey) - DecodeLoop(data, convId, kcpMsgList) + DecodeLoop(data, session.conn.GetConv(), kcpMsgList) + return } func DecodeLoop(data []byte, convId uint64, kcpMsgList *[]*KcpMsg) {