fix
This commit is contained in:
parent
fe680b31b2
commit
cd4c977b83
@ -6,6 +6,7 @@
|
|||||||
//
|
//
|
||||||
|
|
||||||
import Foundation
|
import Foundation
|
||||||
|
import NIOCore
|
||||||
|
|
||||||
actor SDLPuncherActor {
|
actor SDLPuncherActor {
|
||||||
// dstMac
|
// dstMac
|
||||||
@ -14,8 +15,13 @@ actor SDLPuncherActor {
|
|||||||
|
|
||||||
private var udpHoleActor: SDLUDPHoleActor?
|
private var udpHoleActor: SDLUDPHoleActor?
|
||||||
|
|
||||||
|
private var pktId: UInt32 = 1
|
||||||
|
// 提交后还没有响应的请求
|
||||||
|
private var pendingRequests: [UInt32:RegisterRequest] = [:]
|
||||||
|
|
||||||
// 处理holer
|
// 处理holer
|
||||||
private var logger: SDLLogger
|
private var logger: SDLLogger
|
||||||
|
private var querySocketAddress: SocketAddress
|
||||||
|
|
||||||
struct RegisterRequest {
|
struct RegisterRequest {
|
||||||
let srcMac: Data
|
let srcMac: Data
|
||||||
@ -23,7 +29,8 @@ actor SDLPuncherActor {
|
|||||||
let networkId: UInt32
|
let networkId: UInt32
|
||||||
}
|
}
|
||||||
|
|
||||||
init(logger: SDLLogger) {
|
init(querySocketAddress: SocketAddress, logger: SDLLogger) {
|
||||||
|
self.querySocketAddress = querySocketAddress
|
||||||
self.logger = logger
|
self.logger = logger
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -41,11 +48,35 @@ actor SDLPuncherActor {
|
|||||||
// 触发一次打洞
|
// 触发一次打洞
|
||||||
coolingDown.insert(dstMac)
|
coolingDown.insert(dstMac)
|
||||||
|
|
||||||
|
let pktId = self.pktId
|
||||||
|
self.pktId &+= 1
|
||||||
|
if self.pktId == 0 {
|
||||||
|
self.pktId = 1
|
||||||
|
}
|
||||||
|
|
||||||
Task {
|
Task {
|
||||||
await self.tryHole(request: request)
|
await self.tryHole(pktId: pktId, request: request)
|
||||||
// 启动冷却期
|
// 启动冷却期
|
||||||
try? await Task.sleep(for: .seconds(5))
|
try? await Task.sleep(for: .seconds(5))
|
||||||
self.endCooldown(for: dstMac)
|
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)
|
self.coolingDown.remove(key)
|
||||||
}
|
}
|
||||||
|
|
||||||
private func tryHole(request: RegisterRequest) async {
|
private func removePendingRequest(for pktId: UInt32) {
|
||||||
// var queryInfo = SDLQueryInfo()
|
self.pendingRequests.removeValue(forKey: pktId)
|
||||||
// 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 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.sessionManager = SessionManager()
|
||||||
self.arpServer = ArpServer(known_macs: [:])
|
self.arpServer = ArpServer(known_macs: [:])
|
||||||
self.providerActor = SDLTunnelProviderActor(provider: provider, logger: logger)
|
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 {
|
public func start() async throws {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user