diff --git a/Sources/Punchnet/SDLContext.swift b/Sources/Punchnet/SDLContext.swift index ddab91e..9c455ea 100644 --- a/Sources/Punchnet/SDLContext.swift +++ b/Sources/Punchnet/SDLContext.swift @@ -47,8 +47,8 @@ public class SDLContext: @unchecked Sendable { let rsaCipher: RSACipher // 依赖的变量 - var udpHoleActor: SDLUDPHole? - var superClientActor: SDLSuperClient? + var udpHole: SDLUDPHole? + var superClient: SDLSuperClient? // 数据包读取任务 private var readTask: Task<(), Never>? @@ -93,17 +93,17 @@ public class SDLContext: @unchecked Sendable { } public func start() async throws { - self.udpHoleActor = try await SDLUDPHole() - self.superClientActor = try await SDLSuperClient(host: self.config.superHost, port: self.config.superPort) + self.udpHole = try await SDLUDPHole() + self.superClient = try await SDLSuperClient(host: self.config.superHost, port: self.config.superPort) self.noticeClient = try await SDLNoticeClient() try await withThrowingTaskGroup(of: Void.self) { group in group.addTask { - try await self.udpHoleActor?.start() + try await self.udpHole?.start() } group.addTask { - try await self.superClientActor?.start() + try await self.superClient?.start() } group.addTask { @@ -111,7 +111,7 @@ public class SDLContext: @unchecked Sendable { } group.addTask { - if let eventFlow = self.superClientActor?.eventFlow { + if let eventFlow = self.superClient?.eventFlow { for try await event in eventFlow { try await self.handleSuperEvent(event: event) } @@ -119,7 +119,7 @@ public class SDLContext: @unchecked Sendable { } group.addTask { - if let eventFlow = self.udpHoleActor?.eventFlow { + if let eventFlow = self.udpHole?.eventFlow { for try await event in eventFlow { try await self.handleUDPEvent(event: event) } @@ -130,32 +130,32 @@ public class SDLContext: @unchecked Sendable { group.addTask { while !Task.isCancelled { try await Task.sleep(nanoseconds: 5 * 1_000_000_000) - self.lastCookie = await self.udpHoleActor?.stunRequest(context: self) + self.lastCookie = await self.udpHole?.stunRequest(context: self) } } try await group.waitForAll() } -// // 启动网络监控 -// self.monitorCancel = self.monitor.eventFlow.sink { event in -// switch event { -// case .changed: -// // 需要重新探测网络的nat类型 -// Task { -// self.natType = await SDLNatProber.getNatType(udpHole: self.udpHole, config: self.config) -// NSLog("didNetworkPathChanged, nat type is: \(self.natType)") -// } -// case .unreachable: -// NSLog("didNetworkPathUnreachable") -// } -// } -// self.monitor.start() + // 启动网络监控 + self.monitorCancel = self.monitor.eventFlow.sink { event in + switch event { + case .changed: + // 需要重新探测网络的nat类型 + Task { + self.natType = await SDLNatProber.getNatType(udpHole: self.udpHole, config: self.config) + NSLog("didNetworkPathChanged, nat type is: \(self.natType)") + } + case .unreachable: + NSLog("didNetworkPathUnreachable") + } + } + self.monitor.start() } public func stop() async { - self.superClientActor = nil - self.udpHoleActor = nil + self.superClient = nil + self.udpHole = nil self.readTask?.cancel() } @@ -164,7 +164,7 @@ public class SDLContext: @unchecked Sendable { switch event { case .ready: NSLog("[SDLContext] get registerSuper, mac address: \(Self.formatMacAddress(mac: self.devAddr.mac))") - guard let message = try await self.superClientActor?.registerSuper(context: self) else { + guard let message = try await self.superClient?.registerSuper(context: self) else { return } @@ -231,7 +231,7 @@ public class SDLContext: @unchecked Sendable { let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp) if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) { // 发送register包 - await self.udpHoleActor?.sendRegister(context: self, remoteAddress: remoteAddress, dst_mac: sendRegisterEvent.dstMac) + await self.udpHole?.sendRegister(context: self, remoteAddress: remoteAddress, dst_mac: sendRegisterEvent.dstMac) } case .networkShutdown(let shutdownEvent): @@ -254,7 +254,7 @@ public class SDLContext: @unchecked Sendable { var commandAck = SDLCommandAck() commandAck.status = true - await self.superClientActor?.commandAck(packetId: packetId, ack: commandAck) + await self.superClient?.commandAck(packetId: packetId, ack: commandAck) } } @@ -294,7 +294,7 @@ public class SDLContext: @unchecked Sendable { // 判断目标地址是否是tun的网卡地址, 并且是在同一个网络下 if register.dstMac == self.devAddr.mac && register.networkID == self.devAddr.networkID { // 回复ack包 - await self.udpHoleActor?.sendRegisterAck(context: self, remoteAddress: remoteAddress, dst_mac: register.srcMac) + await self.udpHole?.sendRegisterAck(context: self, remoteAddress: remoteAddress, dst_mac: register.srcMac) // 这里需要建立到来源的会话, 在复杂网络下,通过super-node查询到的nat地址不一定靠谱,需要通过udp包的来源地址作为nat地址 let session = Session(dstMac: register.srcMac, natAddress: remoteAddress) await self.sessionManager.addSession(session: session) @@ -383,7 +383,7 @@ public class SDLContext: @unchecked Sendable { .sink { _ in Task { let (forwardNum, p2pNum, inboundNum) = await self.flowTracer.reset() - await self.superClientActor?.flowReport(forwardNum: forwardNum, p2pNum: p2pNum, inboundNum: inboundNum) + await self.superClient?.flowReport(forwardNum: forwardNum, p2pNum: p2pNum, inboundNum: inboundNum) } } } @@ -483,13 +483,13 @@ public class SDLContext: @unchecked Sendable { // 通过session发送到对端 if let session = await self.sessionManager.getSession(toAddress: dstMac) { NSLog("[SDLContext] send packet by session: \(session)") - await self.udpHoleActor?.sendPacket(context: self, session: session, data: encodedPacket) + await self.udpHole?.sendPacket(context: self, session: session, data: encodedPacket) await self.flowTracer.inc(num: data.count, type: .p2p) } else { // 通过super_node进行转发 - await self.udpHoleActor?.forwardPacket(context: self, dst_mac: dstMac, data: encodedPacket) + await self.udpHole?.forwardPacket(context: self, dst_mac: dstMac, data: encodedPacket) // 流量统计 await self.flowTracer.inc(num: data.count, type: .forward) @@ -502,7 +502,7 @@ public class SDLContext: @unchecked Sendable { func holerTask(dstMac: Data) -> Task<(), Never> { return Task { - guard let message = try? await self.superClientActor?.queryInfo(context: self, dst_mac: dstMac) else { + guard let message = try? await self.superClient?.queryInfo(context: self, dst_mac: dstMac) else { return } @@ -513,7 +513,7 @@ public class SDLContext: @unchecked Sendable { if let remoteAddress = peerInfo.v4Info.socketAddress() { SDLLogger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .warning) // 发送register包 - await self.udpHoleActor?.sendRegister(context: self, remoteAddress: remoteAddress, dst_mac: dstMac) + await self.udpHole?.sendRegister(context: self, remoteAddress: remoteAddress, dst_mac: dstMac) } else { SDLLogger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning) } @@ -525,8 +525,8 @@ public class SDLContext: @unchecked Sendable { deinit { self.stunCancel?.cancel() - self.udpHoleActor = nil - self.superClientActor = nil + self.udpHole = nil + self.superClient = nil } }