fix context
This commit is contained in:
parent
ce0f3fa29d
commit
d15240a3a7
@ -22,13 +22,13 @@ import NIOPosix
|
|||||||
actor SDLNoticeClientActor {
|
actor SDLNoticeClientActor {
|
||||||
private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
|
private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
|
||||||
private var channel: Channel?
|
private var channel: Channel?
|
||||||
private let remoteAddress: SocketAddress
|
|
||||||
private let logger: SDLLogger
|
private let logger: SDLLogger
|
||||||
|
private let noticePort: Int
|
||||||
|
|
||||||
// 启动函数
|
// 启动函数
|
||||||
init(noticePort: Int, logger: SDLLogger) throws {
|
init(noticePort: Int, logger: SDLLogger) throws {
|
||||||
self.logger = logger
|
self.logger = logger
|
||||||
self.remoteAddress = try! SocketAddress(ipAddress: "127.0.0.1", port: noticePort)
|
self.noticePort = noticePort
|
||||||
}
|
}
|
||||||
|
|
||||||
func start() throws {
|
func start() throws {
|
||||||
@ -48,10 +48,12 @@ actor SDLNoticeClientActor {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
let buf = channel.allocator.buffer(bytes: data)
|
if let remoteAddress = try? SocketAddress(ipAddress: "127.0.0.1", port: noticePort) {
|
||||||
let envelope = AddressedEnvelope<ByteBuffer>(remoteAddress: self.remoteAddress, data: buf)
|
let buf = channel.allocator.buffer(bytes: data)
|
||||||
channel.eventLoop.execute {
|
let envelope = AddressedEnvelope<ByteBuffer>(remoteAddress: remoteAddress, data: buf)
|
||||||
channel.writeAndFlush(envelope, promise: nil)
|
channel.eventLoop.execute {
|
||||||
|
channel.writeAndFlush(envelope, promise: nil)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -72,7 +72,6 @@ public class SDLContext {
|
|||||||
private var flowTracerCancel: AnyCancellable?
|
private var flowTracerCancel: AnyCancellable?
|
||||||
|
|
||||||
private let logger: SDLLogger
|
private let logger: SDLLogger
|
||||||
private var rootTask: Task<Void, Error>?
|
|
||||||
|
|
||||||
public init(provider: NEPacketTunnelProvider, config: SDLConfiguration, rsaCipher: RSACipher, aesCipher: AESCipher, logger: SDLLogger) {
|
public init(provider: NEPacketTunnelProvider, config: SDLConfiguration, rsaCipher: RSACipher, aesCipher: AESCipher, logger: SDLLogger) {
|
||||||
self.logger = logger
|
self.logger = logger
|
||||||
@ -88,72 +87,29 @@ public class SDLContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public func start() async throws {
|
public func start() async throws {
|
||||||
self.rootTask = Task {
|
// 启动udp服务器
|
||||||
try await withThrowingTaskGroup(of: Void.self) { group in
|
|
||||||
group.addTask {
|
|
||||||
while !Task.isCancelled {
|
|
||||||
do {
|
|
||||||
try await self.startDnsClient()
|
|
||||||
} catch let err {
|
|
||||||
self.logger.log("[SDLContext] UDPHole get err: \(err)", level: .warning)
|
|
||||||
try await Task.sleep(for: .seconds(2))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
group.addTask {
|
|
||||||
while !Task.isCancelled {
|
|
||||||
do {
|
|
||||||
try await self.startUDPHole()
|
|
||||||
} catch let err {
|
|
||||||
self.logger.log("[SDLContext] UDPHole get err: \(err)", level: .warning)
|
|
||||||
try await Task.sleep(for: .seconds(2))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// group.addTask {
|
|
||||||
// await self.startMonitor()
|
|
||||||
// }
|
|
||||||
|
|
||||||
|
|
||||||
// group.addTask {
|
|
||||||
// while !Task.isCancelled {
|
|
||||||
// do {
|
|
||||||
// try await self.startNoticeClient()
|
|
||||||
// } catch let err {
|
|
||||||
// self.logger.log("[SDLContext] noticeClient get err: \(err)", level: .warning)
|
|
||||||
// try await Task.sleep(for: .seconds(2))
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
try await group.waitForAll()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
try await self.rootTask?.value
|
|
||||||
}
|
|
||||||
|
|
||||||
public func stop() async {
|
|
||||||
self.rootTask?.cancel()
|
|
||||||
self.udpHoleActor = nil
|
|
||||||
self.noticeClientActor = nil
|
|
||||||
|
|
||||||
self.readTask?.cancel()
|
|
||||||
}
|
|
||||||
|
|
||||||
private func startNoticeClient() async throws {
|
|
||||||
self.noticeClientActor = try SDLNoticeClientActor(noticePort: self.config.noticePort, logger: self.logger)
|
|
||||||
try await self.noticeClientActor?.start()
|
|
||||||
self.logger.log("[SDLContext] notice_client task cancel", level: .warning)
|
|
||||||
}
|
|
||||||
|
|
||||||
private func startUDPHole() async throws {
|
|
||||||
self.udpHoleActor = try SDLUDPHoleActor(logger: self.logger)
|
self.udpHoleActor = try SDLUDPHoleActor(logger: self.logger)
|
||||||
try await self.udpHoleActor?.start()
|
try await self.udpHoleActor?.start()
|
||||||
|
self.logger.log("[SDLContext] udpHole started")
|
||||||
|
|
||||||
|
// 启动dns服务
|
||||||
|
let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(self.config.remoteDnsServer, port: 15353)
|
||||||
|
self.dnsClientActor = try await SDLDNSClientActor(dnsServerAddress: dnsSocketAddress, logger: self.logger)
|
||||||
|
try await self.dnsClientActor?.start()
|
||||||
|
self.logger.log("[SDLContext] dnsClient started")
|
||||||
|
|
||||||
|
// 启动noticeClient
|
||||||
|
self.noticeClientActor = try SDLNoticeClientActor(noticePort: self.config.noticePort, logger: self.logger)
|
||||||
|
try await self.noticeClientActor?.start()
|
||||||
|
self.logger.log("[SDLContext] noticeClient started")
|
||||||
|
|
||||||
|
// 启动monitor
|
||||||
|
self.monitor = SDLNetworkMonitor()
|
||||||
|
self.monitor?.start()
|
||||||
|
self.logger.log("[SDLContext] monitor started")
|
||||||
|
|
||||||
try await withThrowingTaskGroup(of: Void.self) { group in
|
try await withThrowingTaskGroup(of: Void.self) { group in
|
||||||
|
// 处理UDP的事件流
|
||||||
group.addTask {
|
group.addTask {
|
||||||
while true {
|
while true {
|
||||||
try Task.checkCancellation()
|
try Task.checkCancellation()
|
||||||
@ -172,40 +128,42 @@ public class SDLContext {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 处理DNS的事件流
|
||||||
|
group.addTask {
|
||||||
|
if let packetFlow = self.dnsClientActor?.packetFlow {
|
||||||
|
for await packet in packetFlow {
|
||||||
|
let nePacket = NEPacket(data: packet, protocolFamily: 2)
|
||||||
|
await self.providerActor.writePackets(packets: [nePacket])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 处理Monitor的事件流
|
||||||
|
group.addTask {
|
||||||
|
for await event in self.monitor!.eventStream {
|
||||||
|
switch event {
|
||||||
|
case .changed:
|
||||||
|
// 需要重新探测网络的nat类型
|
||||||
|
//self.natType = await self.getNatType()
|
||||||
|
self.logger.log("didNetworkPathChanged, nat type is: \(self.natType)", level: .info)
|
||||||
|
case .unreachable:
|
||||||
|
self.logger.log("didNetworkPathUnreachable", level: .warning)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if let _ = try await group.next() {
|
if let _ = try await group.next() {
|
||||||
|
self.logger.log("[SDLContext] taskGroup cancel")
|
||||||
group.cancelAll()
|
group.cancelAll()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func startMonitor() async {
|
public func stop() async {
|
||||||
self.monitor = SDLNetworkMonitor()
|
self.udpHoleActor = nil
|
||||||
for await event in self.monitor!.eventStream {
|
self.noticeClientActor = nil
|
||||||
switch event {
|
|
||||||
case .changed:
|
self.readTask?.cancel()
|
||||||
// 需要重新探测网络的nat类型
|
|
||||||
//self.natType = await self.getNatType()
|
|
||||||
|
|
||||||
self.logger.log("didNetworkPathChanged, nat type is: \(self.natType)", level: .info)
|
|
||||||
case .unreachable:
|
|
||||||
self.logger.log("didNetworkPathUnreachable", level: .warning)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private func startDnsClient() async throws {
|
|
||||||
let remoteDnsServer = config.remoteDnsServer
|
|
||||||
let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(remoteDnsServer, port: 15353)
|
|
||||||
self.dnsClientActor = try await SDLDNSClientActor(dnsServerAddress: dnsSocketAddress, logger: self.logger)
|
|
||||||
try await self.dnsClientActor?.start()
|
|
||||||
|
|
||||||
if let packetFlow = self.dnsClientActor?.packetFlow {
|
|
||||||
for await packet in packetFlow {
|
|
||||||
let nePacket = NEPacket(data: packet, protocolFamily: 2)
|
|
||||||
await self.providerActor.writePackets(packets: [nePacket])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private func handleUDPHoleReady() async throws {
|
private func handleUDPHoleReady() async throws {
|
||||||
@ -532,7 +490,6 @@ public class SDLContext {
|
|||||||
}
|
}
|
||||||
|
|
||||||
deinit {
|
deinit {
|
||||||
self.rootTask?.cancel()
|
|
||||||
self.udpHoleActor = nil
|
self.udpHoleActor = nil
|
||||||
self.dnsClientActor = nil
|
self.dnsClientActor = nil
|
||||||
}
|
}
|
||||||
|
|||||||
3
tracelog.sh
Executable file
3
tracelog.sh
Executable file
@ -0,0 +1,3 @@
|
|||||||
|
#! /bin/sh
|
||||||
|
|
||||||
|
log stream --predicate 'subsystem == "com.jihe.punchnet"' --info
|
||||||
Loading…
x
Reference in New Issue
Block a user