79 lines
2.4 KiB
Swift
79 lines
2.4 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
|
|
Task {
|
|
SDLLogger.logLevel = .debug
|
|
do {
|
|
self.context = try SDLContext(provider: self, config: .init(
|
|
version: 1,
|
|
installedChannel: installed_channel,
|
|
superHost: "118.178.229.213",
|
|
superPort: 18083,
|
|
stunServers: [.init(host: "118.178.229.213", 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"}
|
|
}()
|
|
|
|
}
|