diff --git a/punchnet/Core/VPNManager.swift b/punchnet/Core/VPNManager.swift index d809c76..ccd9ff6 100644 --- a/punchnet/Core/VPNManager.swift +++ b/punchnet/Core/VPNManager.swift @@ -10,6 +10,10 @@ import NetworkExtension import SwiftUI import Observation +enum VPNManagerError: Error { + case disconnected +} + // vpn管理类 @Observable class VPNManager { @@ -38,10 +42,10 @@ class VPNManager { NSLog("enable vpn with options: \(options)") let manager = try await loadAndCreateProviderManager() try await manager.loadFromPreferences() - self.manager = manager - self.addVPNStatusObserver(manager) try manager.connection.startVPNTunnel(options: options) + + self.manager = manager } // 关闭vpn @@ -52,6 +56,29 @@ class VPNManager { try await manager.loadFromPreferences() manager.connection.stopVPNTunnel() + self.manager = nil + } + + func sendMessage(_ message: Data) async throws -> Data { + guard let session = self.manager?.connection as? NETunnelProviderSession else { + throw VPNManagerError.disconnected + } + + guard session.status == .connected || session.status == .connecting else { + throw VPNManagerError.disconnected + } + + return try await withCheckedThrowingContinuation { continuation in + do { + try session.sendProviderMessage(message) { responseData in + // 收到响应,恢复异步挂起点 + continuation.resume(returning: responseData ?? Data()) + } + } catch { + // 发送失败,抛出错误 + continuation.resume(throwing: error) + } + } } // MARK: - Private Methods diff --git a/punchnet/Views/AppContext.swift b/punchnet/Views/AppContext.swift index 09cb48d..c58b393 100644 --- a/punchnet/Views/AppContext.swift +++ b/punchnet/Views/AppContext.swift @@ -110,6 +110,13 @@ class AppContext { try await self.vpnManager.enableVpn(options: options) self.networkContext = context self.vpnOptions = options + + // TODO + Task { + try await Task.sleep(for: .seconds(5)) + let resp = try await self.vpnManager.sendMessage("hello vpn".data(using: .utf8)!) + NSLog("resp: \(String(data: resp, encoding: .utf8))") + } } // 断开网络连接