fix
This commit is contained in:
parent
92a05263bb
commit
ce0f3fa29d
@ -5,29 +5,29 @@
|
||||
// Created by 安礼成 on 2025/8/3.
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// PacketTunnelProvider.swift
|
||||
// Tun
|
||||
//
|
||||
// Created by 安礼成 on 2024/1/17.
|
||||
//
|
||||
|
||||
import NetworkExtension
|
||||
|
||||
enum TunnelError: Error {
|
||||
case invalidConfiguration
|
||||
case invalidContext
|
||||
}
|
||||
|
||||
class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||
var context: SDLContext?
|
||||
private var rootTask: Task<Void, Error>?
|
||||
|
||||
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
|
||||
let logger = SDLLogger(level: .debug)
|
||||
|
||||
// host: "192.168.0.101", port: 1265
|
||||
guard let options, let config = SDLConfiguration.parse(options: options) else {
|
||||
NSLog("配置错误")
|
||||
completionHandler(TunnelError.invalidConfiguration)
|
||||
return
|
||||
}
|
||||
|
||||
// 如果当前在运行状态,不允许重复请求
|
||||
guard self.context == nil else {
|
||||
completionHandler(TunnelError.invalidContext)
|
||||
return
|
||||
}
|
||||
|
||||
@ -37,10 +37,10 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
|
||||
|
||||
self.rootTask = Task {
|
||||
do {
|
||||
self.context = SDLContext(provider: self, config: config, rsaCipher: rsaCipher, aesCipher: aesChiper, logger: SDLLogger(level: .debug))
|
||||
self.context = SDLContext(provider: self, config: config, rsaCipher: rsaCipher, aesCipher: aesChiper, logger: logger)
|
||||
try await self.context?.start()
|
||||
} catch let err {
|
||||
NSLog("[PacketTunnelProvider] exit with error: \(err)")
|
||||
logger.log("[PacketTunnelProvider] exit with error: \(err)")
|
||||
exit(-1)
|
||||
}
|
||||
}
|
||||
|
||||
@ -36,7 +36,7 @@ actor SDLDNSClientActor {
|
||||
}
|
||||
|
||||
self.channel = try bootstrap.bind(host: "0.0.0.0", port: 0).wait()
|
||||
self.logger.log("[UDPHole] started", level: .debug)
|
||||
self.logger.log("[DNSClient] started", level: .debug)
|
||||
}
|
||||
|
||||
func forward(ipPacket: IPPacket) {
|
||||
|
||||
@ -96,7 +96,6 @@ extension SDLConfiguration {
|
||||
let superPort = options["super_port"] as? Int,
|
||||
let stunServersStr = options["stun_servers"] as? String,
|
||||
let noticePort = options["notice_port"] as? Int,
|
||||
let token = options["token"] as? String,
|
||||
let accessToken = options["access_token"] as? String,
|
||||
let clientId = options["client_id"] as? String,
|
||||
let remoteDnsServer = options["remote_dns_server"] as? String,
|
||||
@ -114,8 +113,6 @@ extension SDLConfiguration {
|
||||
return nil
|
||||
}
|
||||
|
||||
NSLog("[PacketTunnelProvider] client_id: \(clientId), token: \(token)")
|
||||
|
||||
return SDLConfiguration(version: 1,
|
||||
installedChannel: installed_channel,
|
||||
superHost: superIp,
|
||||
|
||||
@ -112,20 +112,21 @@ public class SDLContext {
|
||||
}
|
||||
}
|
||||
|
||||
group.addTask {
|
||||
await self.startMonitor()
|
||||
}
|
||||
// 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))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 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()
|
||||
}
|
||||
@ -154,7 +155,7 @@ public class SDLContext {
|
||||
|
||||
try await withThrowingTaskGroup(of: Void.self) { group in
|
||||
group.addTask {
|
||||
while !Task.isCancelled {
|
||||
while true {
|
||||
try Task.checkCancellation()
|
||||
try await Task.sleep(nanoseconds: 5 * 1_000_000_000)
|
||||
try Task.checkCancellation()
|
||||
@ -197,30 +198,14 @@ public class SDLContext {
|
||||
let remoteDnsServer = config.remoteDnsServer
|
||||
let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(remoteDnsServer, port: 15353)
|
||||
self.dnsClientActor = try await SDLDNSClientActor(dnsServerAddress: dnsSocketAddress, logger: self.logger)
|
||||
|
||||
try await withThrowingTaskGroup(of: Void.self) { group in
|
||||
defer {
|
||||
self.logger.log("[SDLContext] dns client task cancel", level: .warning)
|
||||
}
|
||||
|
||||
group.addTask {
|
||||
try await self.dnsClientActor?.start()
|
||||
}
|
||||
|
||||
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])
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
if let _ = try await group.next() {
|
||||
group.cancelAll()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private func handleUDPHoleReady() async throws {
|
||||
@ -243,6 +228,8 @@ public class SDLContext {
|
||||
registerSuper.pubKey = self.rsaCipher.pubKey
|
||||
registerSuper.accessToken = self.config.accessToken
|
||||
|
||||
self.logger.log("will send register super")
|
||||
|
||||
await self.udpHoleActor?.send(type: .registerSuper, data: try registerSuper.serializedData(), remoteAddress: self.config.stunSocketAddress)
|
||||
}
|
||||
|
||||
|
||||
@ -5,7 +5,7 @@
|
||||
// Created by 安礼成 on 2024/3/13.
|
||||
//
|
||||
import Foundation
|
||||
import os.log
|
||||
import os
|
||||
|
||||
public class SDLLogger: @unchecked Sendable {
|
||||
public enum Level: Int8, CustomStringConvertible {
|
||||
@ -29,18 +29,15 @@ public class SDLLogger: @unchecked Sendable {
|
||||
}
|
||||
|
||||
private let level: Level
|
||||
private let log: OSLog
|
||||
private let log: Logger
|
||||
|
||||
public init(level: Level) {
|
||||
self.level = level
|
||||
self.log = OSLog(subsystem: "com.jihe.punchnet", category: "punchnet")
|
||||
self.log = Logger(subsystem: "com.jihe.punchnet", category: "punchnet")
|
||||
}
|
||||
|
||||
public func log(_ message: String, level: Level = .debug) {
|
||||
if self.level.rawValue <= level.rawValue {
|
||||
//os_log("%{public}@: %{public}@", log: self.log, type: .debug, level.description, message)
|
||||
NSLog("\(level.description): \(message)")
|
||||
}
|
||||
self.log.info("\(message, privacy: .public)")
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@ -23,7 +23,7 @@ struct SystemConfig {
|
||||
static let superPort = 18083
|
||||
|
||||
// stun探测服务
|
||||
static let stunServers = "118.178.229.213:1265,1266;118.178.229.213:1265,1266"
|
||||
static let stunServers = "118.178.229.213:1365,1366;118.178.229.213:1365,1366"
|
||||
//static let stunServers = "127.0.0.1:1265,1266;127.0.0.1:1265,1266"
|
||||
|
||||
static func getOptions(networkId: UInt32, networkDomain: String, ip: String, maskLen: UInt8, accessToken: String, hostname: String, noticePort: Int) -> [String: NSObject]? {
|
||||
|
||||
@ -14,6 +14,8 @@ struct NetworkDisconnctedView: View {
|
||||
ZStack {
|
||||
Color.clear
|
||||
|
||||
VStack {
|
||||
|
||||
Button {
|
||||
Task {
|
||||
try await startVpn()
|
||||
@ -29,6 +31,23 @@ struct NetworkDisconnctedView: View {
|
||||
.background(Color(red: 74/255, green: 207/255, blue: 154/255))
|
||||
.cornerRadius(5)
|
||||
.frame(width: 120, height: 35)
|
||||
|
||||
Button {
|
||||
Task {
|
||||
try await VPNManager.shared.disableVpn()
|
||||
}
|
||||
} label: {
|
||||
Text("关闭")
|
||||
.font(.system(size: 14, weight: .regular))
|
||||
.padding([.top, .bottom], 8)
|
||||
.padding([.leading, .trailing], 30)
|
||||
.foregroundColor(.white)
|
||||
|
||||
}
|
||||
.background(Color(red: 74/255, green: 207/255, blue: 154/255))
|
||||
.cornerRadius(5)
|
||||
.frame(width: 120, height: 35)
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user