解决网络状态变化的问题

This commit is contained in:
anlicheng 2026-04-30 11:22:49 +08:00
parent 9a3fb6a8d6
commit 136c73ccd1
5 changed files with 76 additions and 41 deletions

View File

@ -13,33 +13,28 @@ enum TunnelError: Error {
}
class PacketTunnelProvider: NEPacketTunnelProvider {
var contextActor: SDLContextActor?
private var rootTask: Task<Void, Never>?
private var runtimeEnv: SDLRuntimeEnvironment?
override func startTunnel(options: [String: NSObject]?, completionHandler: @escaping (Error?) -> Void) {
//
SDLTunnelAppNotifier.shared.clear()
//
guard self.contextActor == nil else {
guard self.runtimeEnv == nil else {
completionHandler(TunnelError.invalidContext)
return
}
//
let rsaCipher = try! CCRSACipher(keySize: 1024)
self.rootTask = Task {
// host: "192.168.0.101", port: 1265
guard let options, let config = await SDLConfiguration.parse(options: options) else {
completionHandler(TunnelError.invalidConfiguration)
return
guard let options else {
completionHandler(TunnelError.invalidConfiguration)
return
}
self.runtimeEnv = SDLRuntimeEnvironment(options: options)
Task {
do {
try await self.runtimeEnv?.start(provider: self)
completionHandler(nil)
} catch let err {
completionHandler(err)
}
let contextActor = SDLContextActor(provider: self, config: config, rsaCipher: rsaCipher)
self.contextActor = contextActor
await contextActor.start()
completionHandler(nil)
}
}
@ -47,12 +42,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) {
// Add code here to start the process of stopping the tunnel.
Task {
await self.contextActor?.stop()
self.contextActor = nil
self.rootTask?.cancel()
self.rootTask = nil
await self.runtimeEnv?.stop()
completionHandler()
}
}
@ -78,7 +68,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
override func sleep(completionHandler: @escaping () -> Void) {
// Add code here to get ready to sleep.
Task {
await self.contextActor?.sleep()
await self.runtimeEnv?.stop()
completionHandler()
}
}
@ -86,15 +76,15 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
override func wake() {
// Add code here to wake up.
Task {
await self.contextActor?.wake()
try await self.runtimeEnv?.start(provider: self)
}
}
private func handleAppRequest(message: AppRequest) async throws -> Data? {
guard let contextActor = self.contextActor else {
guard let contextActor = self.runtimeEnv?.getContextActor() else {
throw TunnelError.invalidContext
}
switch message.command {
case .changeExitNode(let changeExitNode):
let exitNodeIp = changeExitNode.ip
@ -104,12 +94,12 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
reply.code = 0
reply.message = "操作成功"
return try reply.serializedData()
} catch let err {
var reply = TunnelResponse()
reply.code = 1
reply.message = err.localizedDescription
return try reply.serializedData()
}
case .none:
@ -121,3 +111,36 @@ class PacketTunnelProvider: NEPacketTunnelProvider {
}
}
private class SDLRuntimeEnvironment {
var contextActor: SDLContextActor?
private var options: [String: NSObject]
init(options: [String: NSObject]) {
self.options = options
}
func start(provider: PacketTunnelProvider) async throws {
//
SDLTunnelAppNotifier.shared.clear()
guard let config = await SDLConfiguration.parse(options: options) else {
throw TunnelError.invalidConfiguration
}
//
let rsaCipher = try! CCRSACipher(keySize: 1024)
let contextActor = SDLContextActor(provider: provider, config: config, rsaCipher: rsaCipher)
self.contextActor = contextActor
await contextActor.start()
}
func getContextActor() -> SDLContextActor? {
return self.contextActor
}
func stop() async {
await self.contextActor?.stop()
}
}

View File

@ -90,7 +90,7 @@ actor SDLPuncherActor {
phase: .waitingPeerInfo(deadline: now.addingTimeInterval(self.peerInfoTimeout))
)
await quicClient.send(type: .queryInfo, data: queryData)
quicClient.send(type: .queryInfo, data: queryData)
}
func handlePeerInfo(using udpHole: SDLUDPHole?, udpHoleV6: SDLUDPHoleV6?, peerInfo: SDLPeerInfo) async {
@ -156,10 +156,7 @@ actor SDLPuncherActor {
}
}
private func sendRegister(using udpHole: SDLUDPHole?,
udpHoleV6: SDLUDPHoleV6?,
registerData: Data,
remoteAddress: SocketAddress) {
private func sendRegister(using udpHole: SDLUDPHole?, udpHoleV6: SDLUDPHoleV6?, registerData: Data, remoteAddress: SocketAddress) {
switch remoteAddress {
case .v4:
guard let udpHole else {

2
dmg.sh
View File

@ -1,3 +1,3 @@
#! /bin/sh
create-dmg --volname "punchnet" --window-pos 200 120 --window-size 800 400 --icon "punchnet.app" 200 190 --hide-extension "punchnet.app" --app-drop-link 600 185 ~/Desktop/punchnet.dmg /Users/anlicheng/Desktop/punchnetv3
create-dmg --volname "punchnet" --window-pos 200 120 --window-size 800 400 --icon "punchnet.app" 200 190 --hide-extension "punchnet.app" --app-drop-link 600 185 ~/Desktop/punchnet.dmg /Users/anlicheng/Desktop/punchnetv6

View File

@ -9,6 +9,7 @@ import SwiftUI
import AppKit
import SwiftData
import Combine
//import SystemConfiguration
@main
struct punchnetApp: App {
@ -86,7 +87,11 @@ struct punchnetApp: App {
class AppDelegate: NSObject, NSApplicationDelegate {
func applicationWillFinishLaunching(_ notification: Notification) {
// let settings = SCDynamicStoreCopyProxies(nil)
// let proxies = settings as? [String: Any] ?? [:]
// for (key, value) in proxies {
// print("\(key): \(value)")
// }
}
func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply {

View File

@ -33,6 +33,16 @@ struct SDLAPIClient {
]
static func doPost<T: Decodable>(path: String, params: [String: Any], as: T.Type) async throws -> T {
let config = URLSessionConfiguration.default
config.connectionProxyDictionary = [
kCFNetworkProxiesHTTPEnable as String: 0,
kCFNetworkProxiesHTTPSEnable as String: 0,
kCFNetworkProxiesSOCKSEnable as String: 0,
kCFNetworkProxiesProxyAutoConfigEnable as String: 0,
kCFNetworkProxiesProxyAutoDiscoveryEnable as String: 0
]
let session = URLSession(configuration: config)
let postData = try! JSONSerialization.data(withJSONObject: params)
var request = URLRequest(url: URL(string: baseUrl + path)!)
request.httpMethod = "POST"
@ -40,7 +50,7 @@ struct SDLAPIClient {
request.addValue(sign(params: params), forHTTPHeaderField: "X-sign")
request.httpBody = postData
let (data, _) = try await URLSession.shared.data(for: request)
let (data, _) = try await session.data(for: request)
if let response = String(bytes: data, encoding: .utf8) {
NSLog("url: \(path), response is: \(response)")