fix udpHoleServiceProxy

This commit is contained in:
anlicheng 2026-05-20 15:25:40 +08:00
parent e78e49c45b
commit af6b51096b
2 changed files with 34 additions and 7 deletions

View File

@ -68,10 +68,10 @@ actor SDLContextActor {
// //
nonisolated let rsaCipher: RSACipher nonisolated let rsaCipher: RSACipher
private var udpHoleService: SDLUDPHoleService?
private var dnsService: SDLDNSService? private var dnsService: SDLDNSService?
private var packetReaderService: SDLPacketReaderService? private var packetReaderService: SDLPacketReaderService?
private let superServiceProxy = SDLSuperServiceProxy() private let superServiceProxy = SDLSuperServiceProxy()
private let udpHoleServiceProxy = SDLUDPHoleServiceProxy()
private let publicDnsServers = ["223.5.5.5", "119.29.29.29"] private let publicDnsServers = ["223.5.5.5", "119.29.29.29"]
@ -130,7 +130,7 @@ actor SDLContextActor {
let udpHoleService = SDLUDPHoleService(proberActor: self.proberActor) { [weak self] event in let udpHoleService = SDLUDPHoleService(proberActor: self.proberActor) { [weak self] event in
await self?.handleUDPHoleEvent(event) await self?.handleUDPHoleEvent(event)
} }
self.udpHoleService = udpHoleService await self.udpHoleServiceProxy.replace(udpHoleService)
await udpHoleService.start(includeV6: false) await udpHoleService.start(includeV6: false)
let superService = SDLSuperService(host: self.config.serverHost) { [weak self] message in let superService = SDLSuperService(host: self.config.serverHost) { [weak self] message in
@ -157,9 +157,7 @@ actor SDLContextActor {
self.packetReaderService = nil self.packetReaderService = nil
await packetReaderService?.stop() await packetReaderService?.stop()
let udpHoleService = self.udpHoleService await self.udpHoleServiceProxy.stop()
self.udpHoleService = nil
await udpHoleService?.stop()
let dnsService = self.dnsService let dnsService = self.dnsService
self.dnsService = nil self.dnsService = nil
@ -219,7 +217,7 @@ extension SDLContextActor {
} }
private func sendPacket(type: SDLPacketType, data: Data, remoteAddress: SocketAddress) async { private func sendPacket(type: SDLPacketType, data: Data, remoteAddress: SocketAddress) async {
await self.udpHoleService?.send(type: type, data: data, remoteAddress: remoteAddress) await self.udpHoleServiceProxy.send(type: type, data: data, remoteAddress: remoteAddress)
} }
} }
@ -253,7 +251,7 @@ extension SDLContextActor {
SDLLogger.log("[SDLContext] peer message: \(peerInfo)") SDLLogger.log("[SDLContext] peer message: \(peerInfo)")
let packets = await self.puncherActor.makeRegisterPackets(peerInfo: peerInfo) let packets = await self.puncherActor.makeRegisterPackets(peerInfo: peerInfo)
for packet in packets { for packet in packets {
await self.udpHoleService?.send(type: .register, data: packet.data, remoteAddress: packet.remoteAddress) await self.udpHoleServiceProxy.send(type: .register, data: packet.data, remoteAddress: packet.remoteAddress)
} }
case .event(let event): case .event(let event):
await self.handleEvent(event: event) await self.handleEvent(event: event)

View File

@ -238,3 +238,32 @@ actor SDLUDPHoleService {
} }
} }
} }
actor SDLUDPHoleServiceProxy {
private var udpHoleService: SDLUDPHoleService?
private var generation: UInt64 = 0
func replace(_ udpHoleService: SDLUDPHoleService?) async {
self.generation &+= 1
let oldUDPHoleService = self.udpHoleService
self.udpHoleService = udpHoleService
if oldUDPHoleService !== udpHoleService {
await oldUDPHoleService?.stop()
}
}
func stop() async {
self.generation &+= 1
let udpHoleService = self.udpHoleService
self.udpHoleService = nil
await udpHoleService?.stop()
}
func send(type: SDLPacketType, data: Data, remoteAddress: SocketAddress) async {
await self.udpHoleService?.send(type: type, data: data, remoteAddress: remoteAddress)
}
}