fix address

This commit is contained in:
anlicheng 2026-05-21 13:32:21 +08:00
parent 1c15c92c42
commit 2e9a3f2c97
6 changed files with 70 additions and 27 deletions

View File

@ -157,7 +157,7 @@ actor SDLContextActor {
await self.puncherActor.start() await self.puncherActor.start()
await self.arpResolver.start() await self.arpResolver.start()
let dnsService = DNSService(serverHost: self.config.serverHost, publicDnsServers: self.publicDnsServers) { [weak self] event in let dnsService = DNSService(serverAddress: self.config.serverAddress, publicDnsServers: self.publicDnsServers) { [weak self] event in
await self?.handleDNSEvent(event) await self?.handleDNSEvent(event)
} }
self.dnsService = dnsService self.dnsService = dnsService
@ -173,7 +173,7 @@ actor SDLContextActor {
await self.udpHoleServiceProxy.replace(udpHoleService) await self.udpHoleServiceProxy.replace(udpHoleService)
await udpHoleService.start(includeV6: false) await udpHoleService.start(includeV6: false)
let superService = SDLSuperService(host: self.config.serverHost) { [weak self] message in let superService = SDLSuperService(serverName: self.config.serverName, serverAddress: self.config.serverAddress) { [weak self] message in
await self?.handleSuperMessage(message: message) await self?.handleSuperMessage(message: message)
} }
await self.superServiceProxy.replace(superService) await self.superServiceProxy.replace(superService)

View File

@ -32,16 +32,28 @@ final class DNSCloudClient {
private let packetContinuation: AsyncThrowingStream<Data, Error>.Continuation private let packetContinuation: AsyncThrowingStream<Data, Error>.Continuation
private var isPacketContinuationFinished: Bool = false private var isPacketContinuationFinished: Bool = false
/// - Parameter host: sn-server ( "8.8.8.8") /// - Parameter serverAddress: sn-server ( "8.8.8.8")
/// - Parameter port: ( 53) /// - Parameter port: ( 53)
init(host: String, port: UInt16) { init(serverAddress: String, port: UInt16) {
self.dnsServerAddress = .hostPort(host: NWEndpoint.Host(host), port: NWEndpoint.Port(integerLiteral: port)) self.dnsServerAddress = .hostPort(host: Self.makeEndpointHost(address: serverAddress), port: NWEndpoint.Port(integerLiteral: port))
let packetPair = AsyncThrowingStream.makeStream(of: Data.self) let packetPair = AsyncThrowingStream.makeStream(of: Data.self)
self.packetFlow = packetPair.stream self.packetFlow = packetPair.stream
self.packetContinuation = packetPair.continuation self.packetContinuation = packetPair.continuation
} }
private static func makeEndpointHost(address: String) -> NWEndpoint.Host {
if let ipv4Address = IPv4Address(address) {
return .ipv4(ipv4Address)
}
if let ipv6Address = IPv6Address(address) {
return .ipv6(ipv6Address)
}
return .name(address, nil)
}
func start() { func start() {
// 1. // 1.
let parameters = NWParameters.udp let parameters = NWParameters.udp

View File

@ -8,7 +8,7 @@ actor DNSService {
typealias EventHandler = @Sendable (Event) async -> Void typealias EventHandler = @Sendable (Event) async -> Void
private let serverHost: String private let serverAddress: String
private let publicDnsServers: [String] private let publicDnsServers: [String]
private let onEvent: EventHandler private let onEvent: EventHandler
@ -18,8 +18,8 @@ actor DNSService {
private var dnsLocalClient: DNSLocalClient? private var dnsLocalClient: DNSLocalClient?
private var dnsLocalMonitorTask: Task<Void, Never>? private var dnsLocalMonitorTask: Task<Void, Never>?
init(serverHost: String, publicDnsServers: [String], onEvent: @escaping EventHandler) { init(serverAddress: String, publicDnsServers: [String], onEvent: @escaping EventHandler) {
self.serverHost = serverHost self.serverAddress = serverAddress
self.publicDnsServers = publicDnsServers self.publicDnsServers = publicDnsServers
self.onEvent = onEvent self.onEvent = onEvent
} }
@ -88,7 +88,7 @@ actor DNSService {
} }
private func runCloud() async throws { private func runCloud() async throws {
let dnsClient = DNSCloudClient(host: self.serverHost, port: 15353) let dnsClient = DNSCloudClient(serverAddress: self.serverAddress, port: 15353)
self.dnsClient = dnsClient self.dnsClient = dnsClient
dnsClient.start() dnsClient.start()

View File

@ -48,7 +48,8 @@ public class SDLConfiguration {
// //
let version: Int let version: Int
let serverHost: String let serverName: String
let serverAddress: String
let stunSocketAddress: SocketAddress let stunSocketAddress: SocketAddress
@ -64,7 +65,8 @@ public class SDLConfiguration {
var exitNode: ExitNode? var exitNode: ExitNode?
public init(version: Int, public init(version: Int,
serverHost: String, serverName: String,
serverAddress: String,
stunServers: [String], stunServers: [String],
clientId: String, clientId: String,
networkAddress: NetworkAddress, networkAddress: NetworkAddress,
@ -73,8 +75,9 @@ public class SDLConfiguration {
identityId: UInt32, identityId: UInt32,
exitNode: ExitNode?) { exitNode: ExitNode?) {
self.version = version self.version = version
self.serverHost = serverHost self.serverName = serverName
let stunHosts = stunServers.isEmpty ? [serverHost] : stunServers self.serverAddress = serverAddress
let stunHosts = stunServers.isEmpty ? [serverAddress] : stunServers
self.stunSocketAddress = Self.makeStunSocketAddress(host: stunHosts[0], port: 1365) self.stunSocketAddress = Self.makeStunSocketAddress(host: stunHosts[0], port: 1365)
self.stunProbeSocketAddressArray = stunHosts.map { stunServer in self.stunProbeSocketAddressArray = stunHosts.map { stunServer in
[ [
@ -94,6 +97,11 @@ public class SDLConfiguration {
private extension SDLConfiguration { private extension SDLConfiguration {
static func resolveHostAddress(host: String, port: Int) -> String {
let address = try! SocketAddress.makeAddressResolvingHost(host, port: port)
return address.ipAddress!
}
static func makeStunSocketAddress(host: String, port: Int) -> SocketAddress { static func makeStunSocketAddress(host: String, port: Int) -> SocketAddress {
return try! SocketAddress.makeAddressResolvingHost(host, port: port) return try! SocketAddress.makeAddressResolvingHost(host, port: port)
} }
@ -105,7 +113,7 @@ extension SDLConfiguration {
static func parse(options: [String: NSObject]) -> SDLConfiguration? { static func parse(options: [String: NSObject]) -> SDLConfiguration? {
guard let version = options["version"] as? Int, guard let version = options["version"] as? Int,
let serverHost = options["server_host"] as? String, let serverName = options["server_host"] as? String,
let stunAssistHost = options["stun_assist_host"] as? String, let stunAssistHost = options["stun_assist_host"] as? String,
let accessToken = options["access_token"] as? String, let accessToken = options["access_token"] as? String,
let identityId = options["identity_id"] as? UInt32, let identityId = options["identity_id"] as? UInt32,
@ -125,9 +133,12 @@ extension SDLConfiguration {
exitNode = .init(exitNodeIp: exitNodeIp) exitNode = .init(exitNodeIp: exitNodeIp)
} }
let serverAddress = Self.resolveHostAddress(host: serverName, port: 1443)
return SDLConfiguration(version: version, return SDLConfiguration(version: version,
serverHost: serverHost, serverName: serverName,
stunServers: [serverHost, stunAssistHost], serverAddress: serverAddress,
stunServers: [serverName, stunAssistHost],
clientId: clientId, clientId: clientId,
networkAddress: networkAddress, networkAddress: networkAddress,
hostname: hostname, hostname: hostname,

View File

@ -45,11 +45,13 @@ actor SDLSuperClient {
private var connection: NWConnection? private var connection: NWConnection?
private let host: String private let serverName: String
private let serverAddress: String
private let port: UInt16 private let port: UInt16
init(host: String, port: UInt16, maxBufferSize: Int = 2 * 1024 * 1024) { init(serverName: String, serverAddress: String, port: UInt16, maxBufferSize: Int = 2 * 1024 * 1024) {
self.host = host self.serverName = serverName
self.serverAddress = serverAddress
self.port = port self.port = port
self.frameParser = SDLQUICFrameParser(maxBufferSize: maxBufferSize) self.frameParser = SDLQUICFrameParser(maxBufferSize: maxBufferSize)
@ -57,10 +59,14 @@ actor SDLSuperClient {
} }
func start() { func start() {
let host = self.host let serverName = self.serverName
let serverAddress = self.serverAddress
let queue = DispatchQueue(label: "com.sdl.SuperClient.queue") // 线 let queue = DispatchQueue(label: "com.sdl.SuperClient.queue") // 线
let options = NWProtocolTLS.Options() let options = NWProtocolTLS.Options()
serverName.withCString {
sec_protocol_options_set_tls_server_name(options.securityProtocolOptions, $0)
}
sec_protocol_options_add_tls_application_protocol( sec_protocol_options_add_tls_application_protocol(
options.securityProtocolOptions, options.securityProtocolOptions,
"punchnet/1.0" "punchnet/1.0"
@ -71,7 +77,7 @@ actor SDLSuperClient {
options.securityProtocolOptions, options.securityProtocolOptions,
{ _, trust, complete in { _, trust, complete in
// //
complete(TLSVerifier.verify(trust: trust, host: host)) complete(TLSVerifier.verify(trust: trust, host: serverName))
}, },
queue queue
) )
@ -81,7 +87,7 @@ actor SDLSuperClient {
// Network.framework // Network.framework
params.preferNoProxies = true params.preferNoProxies = true
let connection = NWConnection(host: .init(host), port: .init(rawValue: port)!, using: params) let connection = NWConnection(host: Self.makeEndpointHost(address: serverAddress), port: .init(rawValue: port)!, using: params)
connection.stateUpdateHandler = { [weak self] state in connection.stateUpdateHandler = { [weak self] state in
SDLLogger.log("[SDLSuperClient] new state: \(state)", for: .debug) SDLLogger.log("[SDLSuperClient] new state: \(state)", for: .debug)
@ -94,6 +100,18 @@ actor SDLSuperClient {
self.connection = connection self.connection = connection
} }
private static func makeEndpointHost(address: String) -> NWEndpoint.Host {
if let ipv4Address = IPv4Address(address) {
return .ipv4(ipv4Address)
}
if let ipv6Address = IPv6Address(address) {
return .ipv6(ipv6Address)
}
return .name(address, nil)
}
private func handleConnectionState(state: NWConnection.State) { private func handleConnectionState(state: NWConnection.State) {
switch state { switch state {
case .ready: case .ready:

View File

@ -3,15 +3,17 @@ import Foundation
actor SDLSuperService { actor SDLSuperService {
typealias MessageHandler = @Sendable (SDLQUICInboundMessage) async -> Void typealias MessageHandler = @Sendable (SDLQUICInboundMessage) async -> Void
private let host: String private let serverName: String
private let serverAddress: String
private let port: UInt16 private let port: UInt16
private let onMessage: MessageHandler private let onMessage: MessageHandler
private var superClient: SDLSuperClient? private var superClient: SDLSuperClient?
private var monitorTask: Task<Void, Never>? private var monitorTask: Task<Void, Never>?
init(host: String, port: UInt16 = 1443, onMessage: @escaping MessageHandler) { init(serverName: String, serverAddress: String, port: UInt16 = 1443, onMessage: @escaping MessageHandler) {
self.host = host self.serverName = serverName
self.serverAddress = serverAddress
self.port = port self.port = port
self.onMessage = onMessage self.onMessage = onMessage
} }
@ -49,7 +51,7 @@ actor SDLSuperService {
} }
private func runOnce() async throws { private func runOnce() async throws {
let superClient = SDLSuperClient(host: self.host, port: self.port) let superClient = SDLSuperClient(serverName: self.serverName, serverAddress: self.serverAddress, port: self.port)
self.superClient = superClient self.superClient = superClient
await superClient.start() await superClient.start()
@ -72,7 +74,7 @@ actor SDLSuperService {
try await Task.sleep(for: .seconds(0.5)) try await Task.sleep(for: .seconds(0.5))
try Task.checkCancellation() try Task.checkCancellation()
SDLLogger.log("[SDLSuperService] start super client: \(self.host)") SDLLogger.log("[SDLSuperService] start super client: \(self.serverAddress)")
try await withThrowingTaskGroup(of: Void.self) { group in try await withThrowingTaskGroup(of: Void.self) { group in
defer { defer {