fix context
This commit is contained in:
parent
29b9bebe87
commit
0fe9b43c08
@ -78,6 +78,7 @@ public class SDLContext: @unchecked Sendable {
|
||||
// 处理holer
|
||||
private var holerPublishers: [Data:PassthroughSubject<RegisterRequest, Never>] = [:]
|
||||
private var bag = Set<AnyCancellable>()
|
||||
private var locker = NSLock()
|
||||
|
||||
struct RegisterRequest {
|
||||
let srcMac: Data
|
||||
@ -492,7 +493,7 @@ public class SDLContext: @unchecked Sendable {
|
||||
else {
|
||||
// 构造arp请求
|
||||
let broadcastMac = Data([0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF])
|
||||
let arpReqeust: ARPPacket = ARPPacket.arpRequest(senderIP: self.devAddr.netAddr, senderMAC: self.devAddr.mac, targetIP: dstIp)
|
||||
let arpReqeust = ARPPacket.arpRequest(senderIP: self.devAddr.netAddr, senderMAC: self.devAddr.mac, targetIP: dstIp)
|
||||
await self.routeLayerPacket(dstMac: broadcastMac, type: .arp, data: arpReqeust.marshal())
|
||||
|
||||
NSLog("[SDLContext] dstIp: \(dstIp) arp query not found")
|
||||
@ -528,19 +529,26 @@ public class SDLContext: @unchecked Sendable {
|
||||
|
||||
// 尝试打洞
|
||||
let registerRequest = RegisterRequest(srcMac: self.devAddr.mac, dstMac: dstMac, networkId: self.devAddr.networkID)
|
||||
self.submitRegisterRequest(dstMac: dstMac, request: registerRequest)
|
||||
|
||||
self.submitRegisterRequest(request: registerRequest)
|
||||
}
|
||||
}
|
||||
|
||||
private func submitRegisterRequest(dstMac: Data, request: RegisterRequest) {
|
||||
private func submitRegisterRequest(request: RegisterRequest) {
|
||||
self.locker.lock()
|
||||
defer {
|
||||
self.locker.unlock()
|
||||
}
|
||||
|
||||
let dstMac = request.dstMac
|
||||
if let publisher = self.holerPublishers[dstMac] {
|
||||
publisher.send(request)
|
||||
} else {
|
||||
let publisher = PassthroughSubject<RegisterRequest, Never>()
|
||||
publisher.debounce(for: .seconds(5), scheduler: DispatchQueue.global())
|
||||
.sink { request in
|
||||
self.tryHole(request: request)
|
||||
Task {
|
||||
await self.tryHole(request: request)
|
||||
}
|
||||
}
|
||||
.store(in: &self.bag)
|
||||
|
||||
@ -548,26 +556,24 @@ public class SDLContext: @unchecked Sendable {
|
||||
}
|
||||
}
|
||||
|
||||
private func tryHole(request: RegisterRequest) {
|
||||
Task {
|
||||
guard let message = try? await self.superClient?.queryInfo(dst_mac: request.dstMac).get() else {
|
||||
return
|
||||
}
|
||||
private func tryHole(request: RegisterRequest) async {
|
||||
guard let message = try? await self.superClient?.queryInfo(dst_mac: request.dstMac).get() else {
|
||||
return
|
||||
}
|
||||
|
||||
switch message.packet {
|
||||
case .empty:
|
||||
SDLLogger.log("[SDLContext] hole query_info get empty: \(message)", level: .debug)
|
||||
case .peerInfo(let peerInfo):
|
||||
if let remoteAddress = peerInfo.v4Info.socketAddress() {
|
||||
SDLLogger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .warning)
|
||||
// 发送register包
|
||||
await self.udpHole?.sendRegister(remoteAddress: remoteAddress, networkId: request.networkId, srcMac: request.srcMac, dst_mac: request.dstMac)
|
||||
} else {
|
||||
SDLLogger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
|
||||
}
|
||||
default:
|
||||
SDLLogger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning)
|
||||
switch message.packet {
|
||||
case .empty:
|
||||
SDLLogger.log("[SDLContext] hole query_info get empty: \(message)", level: .debug)
|
||||
case .peerInfo(let peerInfo):
|
||||
if let remoteAddress = peerInfo.v4Info.socketAddress() {
|
||||
SDLLogger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .warning)
|
||||
// 发送register包
|
||||
await self.udpHole?.sendRegister(remoteAddress: remoteAddress, networkId: request.networkId, srcMac: request.srcMac, dst_mac: request.dstMac)
|
||||
} else {
|
||||
SDLLogger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
|
||||
}
|
||||
default:
|
||||
SDLLogger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user