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