fix
This commit is contained in:
parent
fe680b31b2
commit
cd4c977b83
@ -6,6 +6,7 @@
|
||||
//
|
||||
|
||||
import Foundation
|
||||
import NIOCore
|
||||
|
||||
actor SDLPuncherActor {
|
||||
// dstMac
|
||||
@ -14,8 +15,13 @@ actor SDLPuncherActor {
|
||||
|
||||
private var udpHoleActor: SDLUDPHoleActor?
|
||||
|
||||
private var pktId: UInt32 = 1
|
||||
// 提交后还没有响应的请求
|
||||
private var pendingRequests: [UInt32:RegisterRequest] = [:]
|
||||
|
||||
// 处理holer
|
||||
private var logger: SDLLogger
|
||||
private var querySocketAddress: SocketAddress
|
||||
|
||||
struct RegisterRequest {
|
||||
let srcMac: Data
|
||||
@ -23,7 +29,8 @@ actor SDLPuncherActor {
|
||||
let networkId: UInt32
|
||||
}
|
||||
|
||||
init(logger: SDLLogger) {
|
||||
init(querySocketAddress: SocketAddress, logger: SDLLogger) {
|
||||
self.querySocketAddress = querySocketAddress
|
||||
self.logger = logger
|
||||
}
|
||||
|
||||
@ -41,11 +48,35 @@ actor SDLPuncherActor {
|
||||
// 触发一次打洞
|
||||
coolingDown.insert(dstMac)
|
||||
|
||||
let pktId = self.pktId
|
||||
self.pktId &+= 1
|
||||
if self.pktId == 0 {
|
||||
self.pktId = 1
|
||||
}
|
||||
|
||||
Task {
|
||||
await self.tryHole(request: request)
|
||||
await self.tryHole(pktId: pktId, request: request)
|
||||
// 启动冷却期
|
||||
try? await Task.sleep(for: .seconds(5))
|
||||
self.endCooldown(for: dstMac)
|
||||
self.removePendingRequest(for: pktId)
|
||||
}
|
||||
}
|
||||
|
||||
func handlePeerInfo(peerInfo: SDLPeerInfo) async {
|
||||
if let request = pendingRequests.removeValue(forKey: peerInfo.pktID) {
|
||||
if let remoteAddress = peerInfo.v4Info.socketAddress() {
|
||||
self.logger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug)
|
||||
// 发送register包
|
||||
var register = SDLRegister()
|
||||
register.networkID = request.networkId
|
||||
register.srcMac = request.srcMac
|
||||
register.dstMac = request.dstMac
|
||||
|
||||
await self.udpHoleActor?.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
|
||||
} else {
|
||||
self.logger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -53,32 +84,18 @@ actor SDLPuncherActor {
|
||||
self.coolingDown.remove(key)
|
||||
}
|
||||
|
||||
private func tryHole(request: RegisterRequest) async {
|
||||
// var queryInfo = SDLQueryInfo()
|
||||
// queryInfo.dstMac = request.dstMac
|
||||
// guard let message = try? await self.superClientActor?.request(type: .queryInfo, data: try queryInfo.serializedData()) else {
|
||||
// return
|
||||
// }
|
||||
//
|
||||
// switch message.packet {
|
||||
// case .empty:
|
||||
// self.logger.log("[SDLContext] hole query_info get empty: \(message)", level: .debug)
|
||||
// case .peerInfo(let peerInfo):
|
||||
// if let remoteAddress = peerInfo.v4Info.socketAddress() {
|
||||
// self.logger.log("[SDLContext] hole sock address: \(remoteAddress)", level: .debug)
|
||||
// // 发送register包
|
||||
// var register = SDLRegister()
|
||||
// register.networkID = request.networkId
|
||||
// register.srcMac = request.srcMac
|
||||
// register.dstMac = request.dstMac
|
||||
//
|
||||
// await self.udpHoleActor?.send(type: .register, data: try! register.serializedData(), remoteAddress: remoteAddress)
|
||||
// } else {
|
||||
// self.logger.log("[SDLContext] hole sock address is invalid: \(peerInfo.v4Info)", level: .warning)
|
||||
// }
|
||||
// default:
|
||||
// self.logger.log("[SDLContext] hole query_info is packet: \(message)", level: .warning)
|
||||
// }
|
||||
private func removePendingRequest(for pktId: UInt32) {
|
||||
self.pendingRequests.removeValue(forKey: pktId)
|
||||
}
|
||||
|
||||
private func tryHole(pktId: UInt32, request: RegisterRequest) async {
|
||||
var queryInfo = SDLQueryInfo()
|
||||
queryInfo.pktID = pktId
|
||||
queryInfo.dstMac = request.dstMac
|
||||
self.pendingRequests[pktId] = request
|
||||
|
||||
if let queryData = try? queryInfo.serializedData() {
|
||||
await self.udpHoleActor?.send(type: .queryInfo, data: queryData, remoteAddress: self.querySocketAddress)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -83,7 +83,7 @@ public class SDLContext {
|
||||
self.sessionManager = SessionManager()
|
||||
self.arpServer = ArpServer(known_macs: [:])
|
||||
self.providerActor = SDLTunnelProviderActor(provider: provider, logger: logger)
|
||||
self.puncherActor = SDLPuncherActor(logger: logger)
|
||||
self.puncherActor = SDLPuncherActor(querySocketAddress: config.stunSocketAddress, logger: logger)
|
||||
}
|
||||
|
||||
public func start() async throws {
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user