// // PacketTunnelProvider.swift // Tun // // Created by 安礼成 on 2024/1/17. // import NetworkExtension class PacketTunnelProvider: NEPacketTunnelProvider { var context: SDLContext? override func startTunnel(options: [String : NSObject]?, completionHandler: @escaping (Error?) -> Void) { // host: "192.168.0.101", port: 1265 guard let options else { return } let token = options["token"] as! String //let version = options["version"] as! Int let installed_channel = options["installed_channel"] as! String let superIp = options["super_ip"] as! String Task { SDLLogger.logLevel = .debug do { self.context = try SDLContext(provider: self, config: .init( version: 1, installedChannel: installed_channel, //superHost: "118.178.229.213", superHost: superIp, superPort: 18083, stunServers: [.init(host: superIp, ports: [1265, 1266]), .init(host: "118.178.229.213", ports: [1265, 1266])], clientId: SDLContext.getUUID(), token: "" //token: token )) try await self.context?.start() completionHandler(nil) } catch let err { NSLog("SDLContext start get error: \(err)") completionHandler(err) } } } override func stopTunnel(with reason: NEProviderStopReason, completionHandler: @escaping () -> Void) { // Add code here to start the process of stopping the tunnel. completionHandler() } override func handleAppMessage(_ messageData: Data, completionHandler: ((Data?) -> Void)?) { // Add code here to handle the message. if let handler = completionHandler { handler(messageData) } } override func sleep(completionHandler: @escaping () -> Void) { // Add code here to get ready to sleep. completionHandler() } override func wake() { // Add code here to wake up. } } // 获取物理网卡ip地址 extension PacketTunnelProvider { public static var viaInterface: NetworkInterface? = { let interfaces = NetworkInterfaceManager.getInterfaces() return interfaces.first {$0.name == "en0"} }() }