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
private var udpHoleService: SDLUDPHoleService?
private var dnsService: SDLDNSService?
private var packetReaderService: SDLPacketReaderService?
private let superServiceProxy = SDLSuperServiceProxy()
private let udpHoleServiceProxy = SDLUDPHoleServiceProxy()
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
await self?.handleUDPHoleEvent(event)
}
self.udpHoleService = udpHoleService
await self.udpHoleServiceProxy.replace(udpHoleService)
await udpHoleService.start(includeV6: false)
let superService = SDLSuperService(host: self.config.serverHost) { [weak self] message in
@ -157,9 +157,7 @@ actor SDLContextActor {
self.packetReaderService = nil
await packetReaderService?.stop()
let udpHoleService = self.udpHoleService
self.udpHoleService = nil
await udpHoleService?.stop()
await self.udpHoleServiceProxy.stop()
let dnsService = self.dnsService
self.dnsService = nil
@ -219,7 +217,7 @@ extension SDLContextActor {
}
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)")
let packets = await self.puncherActor.makeRegisterPackets(peerInfo: peerInfo)
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):
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)
}
}