swiftlib_sdlan/Sources/sdlan/PacketTunnelProvider.swift
2025-07-14 15:33:40 +08:00

82 lines
2.5 KiB
Swift

//
// 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"}
}()
}