diff --git a/Tun/Punchnet/Actors/SDLPuncherActor.swift b/Tun/Punchnet/Actors/SDLPuncherActor.swift index 9a8c3c4..d7e3fbd 100644 --- a/Tun/Punchnet/Actors/SDLPuncherActor.swift +++ b/Tun/Punchnet/Actors/SDLPuncherActor.swift @@ -93,7 +93,7 @@ actor SDLPuncherActor { quicClient.send(type: .queryInfo, data: queryData) } - func handlePeerInfo(using udpHole: SDLUDPHole?, peerInfo: SDLPeerInfo) async { + func handlePeerInfo(using udpHole: SDLUDPHole?, udpHoleV6: SDLUDPHoleV6?, peerInfo: SDLPeerInfo) async { let now = Date() self.cleanupExpiredEntries(now: now) @@ -108,23 +108,6 @@ actor SDLPuncherActor { entry.markCoolingDown() self.requestEntries[peerInfo.dstMac] = entry - guard let udpHole else { - SDLLogger.log("[SDLPuncherActor] udpHole is nil when peerInfo arrived", for: .debug) - return - } - - guard peerInfo.hasV4Info else { - SDLLogger.log("[SDLPuncherActor] peerInfo missing v4Info", for: .debug) - return - } - - guard let remoteAddress = try? await peerInfo.v4Info.socketAddress() else { - SDLLogger.log("[SDLPuncherActor] failed to resolve peerInfo.v4Info", for: .debug) - return - } - - SDLLogger.log("[SDLContext] hole sock address: \(remoteAddress)", for: .punchnet) - var register = SDLRegister() register.networkID = entry.request.networkId register.srcMac = entry.request.srcMac @@ -135,7 +118,25 @@ actor SDLPuncherActor { return } - udpHole.send(type: .register, data: registerData, remoteAddress: remoteAddress) + // 并行发送register请求 + if let udpHole, peerInfo.hasV4Info { + if let remoteAddress = try? await peerInfo.v4Info.socketAddress() { + SDLLogger.log("[SDLContext] hole sock address: \(remoteAddress)", for: .punchnet) + udpHole.send(type: .register, data: registerData, remoteAddress: remoteAddress) + } else { + SDLLogger.log("[SDLPuncherActor] failed to resolve peerInfo.v4Info", for: .debug) + } + } + + if let udpHoleV6, peerInfo.hasV6Info { + if let remoteAddress = try? await peerInfo.v6Info.socketAddress() { + SDLLogger.log("[SDLContext] hole sock address v6: \(remoteAddress)", for: .punchnet) + udpHoleV6.send(type: .register, data: registerData, remoteAddress: remoteAddress) + } else { + SDLLogger.log("[SDLPuncherActor] failed to resolve peerInfo.v6Info", for: .debug) + } + } + } func stop() {