From d00296737b64e09f4b48354dee51a08bd0a900a0 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 27 Aug 2025 19:11:22 +0800 Subject: [PATCH] fix bug --- Tun/PacketTunnelProvider.swift | 3 +- dmg.sh | 2 +- .../xcschemes/xcschememanagement.plist | 15 +++++++ punchnet/Core/SystemConfig.swift | 5 ++- punchnet/Core/UDPNoticeCenterServer.swift | 9 ++-- punchnet/Views/IndexView.swift | 44 ++++++++++++++++--- punchnet/punchnetApp.swift | 16 +++++-- 7 files changed, 75 insertions(+), 19 deletions(-) diff --git a/Tun/PacketTunnelProvider.swift b/Tun/PacketTunnelProvider.swift index 4a55140..d8052ac 100644 --- a/Tun/PacketTunnelProvider.swift +++ b/Tun/PacketTunnelProvider.swift @@ -36,6 +36,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { let superPort = options["super_port"] as! Int let stunServersStr = options["stun_servers"] as! String let noticePort = options["notice_port"] as! Int + let token = options["token"] as! String let stunServers = stunServersStr.split(separator: ";").compactMap { server -> SDLConfiguration.StunServer? in let parts = server.split(separator: ":", maxSplits: 2) @@ -63,7 +64,7 @@ class PacketTunnelProvider: NEPacketTunnelProvider { stunServers: stunServers, clientId: SDLContext.getUUID(), noticePort: noticePort, - token: "") + token: token) // 加密算法 let rsaCipher = try! CCRSACipher(keySize: 1024) let aesChiper = CCAESChiper() diff --git a/dmg.sh b/dmg.sh index 38bbb4e..82241bd 100755 --- a/dmg.sh +++ b/dmg.sh @@ -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/punchnet_v1 +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/punchnet_macos_v1 diff --git a/punchnet.xcodeproj/xcuserdata/anlicheng.xcuserdatad/xcschemes/xcschememanagement.plist b/punchnet.xcodeproj/xcuserdata/anlicheng.xcuserdatad/xcschemes/xcschememanagement.plist index 9a05d24..3accfd2 100644 --- a/punchnet.xcodeproj/xcuserdata/anlicheng.xcuserdatad/xcschemes/xcschememanagement.plist +++ b/punchnet.xcodeproj/xcuserdata/anlicheng.xcuserdatad/xcschemes/xcschememanagement.plist @@ -10,10 +10,20 @@ 0 punchnet.xcscheme_^#shared#^_ + + orderHint + 2 + + punchnetTests.xcscheme_^#shared#^_ orderHint 1 + punchnetUITests.xcscheme_^#shared#^_ + + orderHint + 0 + SuppressBuildableAutocreation @@ -22,6 +32,11 @@ primary + C8A77F052DD1E6D100195617 + + primary + + C8A77F262DD1E77B00195617 primary diff --git a/punchnet/Core/SystemConfig.swift b/punchnet/Core/SystemConfig.swift index 9a3c02e..a20bac1 100644 --- a/punchnet/Core/SystemConfig.swift +++ b/punchnet/Core/SystemConfig.swift @@ -25,7 +25,7 @@ struct SystemConfig { // stun探测服务 static let stunServers = "118.178.229.213:1265,1266;118.178.229.213:1265,1266" - static func getOptions(token: String) -> [String:NSObject]? { + static func getOptions(token: String, noticePort: Int) -> [String:NSObject]? { guard let superIp = DNSResolver.resolveAddrInfos(superHost).first else { return nil } @@ -35,7 +35,8 @@ struct SystemConfig { "token": token as NSObject, "super_ip": "118.178.229.213" as NSObject, "super_port": superPort as NSObject, - "stun_servers": stunServers as NSObject + "stun_servers": stunServers as NSObject, + "notice_port": noticePort as NSObject ] print("options: \(options)") diff --git a/punchnet/Core/UDPNoticeCenterServer.swift b/punchnet/Core/UDPNoticeCenterServer.swift index 0f5592d..d93bd8c 100644 --- a/punchnet/Core/UDPNoticeCenterServer.swift +++ b/punchnet/Core/UDPNoticeCenterServer.swift @@ -18,11 +18,7 @@ final class UDPNoticeCenterServer: ChannelInboundHandler { private var channel: Channel? var messageFlow = PassthroughSubject() - static let shared = UDPNoticeCenterServer() - - private init() { - - } + public var port: Int = 0 func start() { self.group = MultiThreadedEventLoopGroup(numberOfThreads: 1) @@ -31,7 +27,8 @@ final class UDPNoticeCenterServer: ChannelInboundHandler { .channelInitializer { channel in channel.pipeline.addHandler(self) } - self.channel = try! bootstrap.bind(host: "127.0.0.1", port: 50195).wait() + self.channel = try! bootstrap.bind(host: "127.0.0.1", port: 0).wait() + self.port = self.channel?.localAddress?.port ?? 0 } func stop() { diff --git a/punchnet/Views/IndexView.swift b/punchnet/Views/IndexView.swift index 6d88fdc..87f81ac 100644 --- a/punchnet/Views/IndexView.swift +++ b/punchnet/Views/IndexView.swift @@ -21,6 +21,12 @@ struct IndexView: View { @State private var showMenu: Bool = false + // 显示ip信息 + @State private var showIpAdress: Bool = false + @State private var ipAddress: String = "" + + public var noticeServer: UDPNoticeCenterServer + var body: some View { VStack(alignment: .center, spacing: 10) { @@ -47,6 +53,24 @@ struct IndexView: View { self.showMenu = false } + if showIpAdress { + HStack { + Spacer() + + Text("ip: ") + .font(.system(size: 16, weight: .medium)) + .foregroundColor(.white) + .cornerRadius(5.0) + + Text(ipAddress) + .font(.system(size: 16, weight: .medium)) + .foregroundColor(.white) + .cornerRadius(5.0) + + Spacer() + } + } + Spacer() .frame(width: 1, height: 10) @@ -176,10 +200,18 @@ struct IndexView: View { } } .onAppear { - self.cancel = UDPNoticeCenterServer.shared.messageFlow.sink{ message in + self.cancel = self.noticeServer.messageFlow.sink{ message in DispatchQueue.main.async { - self.message = message - self.showStunAlert = true + switch message { + case .none: + () + case .ip(let ip): + self.showIpAdress = true + self.ipAddress = ip + default: + self.message = message + self.showStunAlert = true + } } } } @@ -188,15 +220,17 @@ struct IndexView: View { private func clickSwitchButton() async throws { switch self.vpnManager.vpnStatus { case .connected: + self.showIpAdress = false + self.ipAddress = "" try await vpnManager.disableVpn() case .disconnected: - try await vpnManager.enableVpn(options: SystemConfig.getOptions(token: self.token)!) + try await vpnManager.enableVpn(options: SystemConfig.getOptions(token: self.token, noticePort: self.noticeServer.port)!) } } } #Preview { - IndexView() + //IndexView(noticeServer: server) //.modelContainer(for: Item.self, inMemory: true) } diff --git a/punchnet/punchnetApp.swift b/punchnet/punchnetApp.swift index b1d5e30..cda4f5c 100644 --- a/punchnet/punchnetApp.swift +++ b/punchnet/punchnetApp.swift @@ -33,9 +33,16 @@ struct punchnetApp: App { @AppStorage("token") var token: String = "" @ObservedObject var vpnManager = VPNManager.shared + private var noticeServer: UDPNoticeCenterServer + + init() { + self.noticeServer = UDPNoticeCenterServer() + self.noticeServer.start() + } + var body: some Scene { WindowGroup(id: "mainWindow") { - IndexView() + IndexView(noticeServer: self.noticeServer) .frame(minWidth: 300, maxWidth: 300, minHeight: 500, maxHeight: 500) .onAppear { // 获取主屏幕的尺寸 @@ -53,6 +60,8 @@ struct punchnetApp: App { window.setFrameOrigin(NSPoint(x: centerX, y: centerY)) } } + .toolbar(.hidden) + .navigationTitle("") } .commands { CommandGroup(replacing: .appInfo) { @@ -94,7 +103,7 @@ struct punchnetApp: App { switch self.vpnManager.vpnStatus { case .disconnected: Task { - try await vpnManager.enableVpn(options: SystemConfig.getOptions(token: self.token)!) + try await vpnManager.enableVpn(options: SystemConfig.getOptions(token: self.token, noticePort: self.noticeServer.port)!) } case .connected: Task { @@ -109,7 +118,7 @@ struct punchnetApp: App { class AppDelegate: NSObject, NSApplicationDelegate { func applicationWillFinishLaunching(_ notification: Notification) { - UDPNoticeCenterServer.shared.start() + } func applicationShouldTerminate(_ sender: NSApplication) -> NSApplication.TerminateReply { @@ -118,7 +127,6 @@ class AppDelegate: NSObject, NSApplicationDelegate { DispatchQueue.main.async { sender.reply(toApplicationShouldTerminate: true) } - UDPNoticeCenterServer.shared.stop() } return .terminateLater