fix actor

This commit is contained in:
anlicheng 2026-01-29 22:13:31 +08:00
parent 2abef3d0bf
commit 5bb971bef3
5 changed files with 28 additions and 29 deletions

View File

@ -102,8 +102,8 @@ actor SDLNATProberActor {
session.replies[reply.step] = reply session.replies[reply.step] = reply
// 退nat // 退nat
if let step1 = session.replies[1] { if session.replies[1] != nil {
let localAddress = await self.udpHole.getLocalAddress() let localAddress = self.udpHole.getLocalAddress()
if reply.socketAddress() == localAddress { if reply.socketAddress() == localAddress {
finish(cookie: session.cookieId, .noNat) finish(cookie: session.cookieId, .noNat)
return return
@ -123,14 +123,14 @@ actor SDLNATProberActor {
if session.replies[1] != nil && session.replies[2] != nil && session.replies[3] != nil && session.replies[4] != nil { if session.replies[1] != nil && session.replies[2] != nil && session.replies[3] != nil && session.replies[4] != nil {
// step3: ip2:port2 <---- ip1:port1 (ipport) // step3: ip2:port2 <---- ip1:port1 (ipport)
// IPNAT // IPNAT
if let step3 = session.replies[3] { if session.replies[3] != nil {
finish(cookie: session.cookieId, .fullCone) finish(cookie: session.cookieId, .fullCone)
return return
} }
// step3: ip1:port1 <---- ip1:port2 (port) // step3: ip1:port1 <---- ip1:port2 (port)
// IPNAT // IPNAT
if let step4 = session.replies[4] { if session.replies[4] != nil {
finish(cookie: session.cookieId, .coneRestricted) finish(cookie: session.cookieId, .coneRestricted)
return return
} }
@ -163,10 +163,10 @@ actor SDLNATProberActor {
// MARK: - Internal helpers // MARK: - Internal helpers
private func sendProbe(cookie: UInt32) async { private func sendProbe(cookie: UInt32) async {
await self.udpHole.send(type: .stunProbe, data: makeProbePacket(cookieId: cookie, step: 1, attr: .none), remoteAddress: addressArray[0][0]) self.udpHole.send(type: .stunProbe, data: makeProbePacket(cookieId: cookie, step: 1, attr: .none), remoteAddress: addressArray[0][0])
await self.udpHole.send(type: .stunProbe, data: makeProbePacket(cookieId: cookie, step: 2, attr: .none), remoteAddress: addressArray[1][1]) self.udpHole.send(type: .stunProbe, data: makeProbePacket(cookieId: cookie, step: 2, attr: .none), remoteAddress: addressArray[1][1])
await self.udpHole.send(type: .stunProbe, data: makeProbePacket(cookieId: cookie, step: 3, attr: .peer), remoteAddress: addressArray[0][0]) self.udpHole.send(type: .stunProbe, data: makeProbePacket(cookieId: cookie, step: 3, attr: .peer), remoteAddress: addressArray[0][0])
await self.udpHole.send(type: .stunProbe, data: makeProbePacket(cookieId: cookie, step: 4, attr: .port), remoteAddress: addressArray[0][0]) self.udpHole.send(type: .stunProbe, data: makeProbePacket(cookieId: cookie, step: 4, attr: .port), remoteAddress: addressArray[0][0])
} }
private func makeProbePacket(cookieId: UInt32, step: UInt32, attr: SDLProbeAttr) -> Data { private func makeProbePacket(cookieId: UInt32, step: UInt32, attr: SDLProbeAttr) -> Data {

View File

@ -19,7 +19,7 @@ import NIOCore
import NIOPosix import NIOPosix
// sn-server // sn-server
actor SDLNoticeClientActor { final class SDLNoticeClient {
private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
private var channel: Channel? private var channel: Channel?
private let logger: SDLLogger private let logger: SDLLogger
@ -63,7 +63,7 @@ actor SDLNoticeClientActor {
} }
extension SDLNoticeClientActor { extension SDLNoticeClient {
private class SDLNoticeClientInboundHandler: ChannelInboundHandler { private class SDLNoticeClientInboundHandler: ChannelInboundHandler {
typealias InboundIn = AddressedEnvelope<ByteBuffer> typealias InboundIn = AddressedEnvelope<ByteBuffer>

View File

@ -47,7 +47,7 @@ public class SDLContext {
var providerActor: SDLTunnelProviderActor var providerActor: SDLTunnelProviderActor
var puncherActor: SDLPuncherActor var puncherActor: SDLPuncherActor
// dnsclient // dnsclient
var dnsClientActor: SDLDNSClientActor? var dnsClient: SDLDNSClient?
// //
var proberActor: SDLNATProberActor? var proberActor: SDLNATProberActor?
@ -65,7 +65,7 @@ public class SDLContext {
private var monitor: SDLNetworkMonitor? private var monitor: SDLNetworkMonitor?
// socket // socket
private var noticeClientActor: SDLNoticeClientActor? private var noticeClient: SDLNoticeClient?
// //
private var flowTracer = SDLFlowTracerActor() private var flowTracer = SDLFlowTracerActor()
@ -94,13 +94,13 @@ public class SDLContext {
// dns // dns
let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(self.config.remoteDnsServer, port: 15353) let dnsSocketAddress = try SocketAddress.makeAddressResolvingHost(self.config.remoteDnsServer, port: 15353)
self.dnsClientActor = try await SDLDNSClientActor(dnsServerAddress: dnsSocketAddress, logger: self.logger) self.dnsClient = try await SDLDNSClient(dnsServerAddress: dnsSocketAddress, logger: self.logger)
try await self.dnsClientActor?.start() try self.dnsClient?.start()
self.logger.log("[SDLContext] dnsClient started") self.logger.log("[SDLContext] dnsClient started")
// noticeClient // noticeClient
self.noticeClientActor = try SDLNoticeClientActor(noticePort: self.config.noticePort, logger: self.logger) self.noticeClient = try SDLNoticeClient(noticePort: self.config.noticePort, logger: self.logger)
try await self.noticeClientActor?.start() try self.noticeClient?.start()
self.logger.log("[SDLContext] noticeClient started") self.logger.log("[SDLContext] noticeClient started")
// monitor // monitor
@ -132,7 +132,7 @@ public class SDLContext {
// DNS // DNS
group.addTask { group.addTask {
if let packetFlow = self.dnsClientActor?.packetFlow { if let packetFlow = self.dnsClient?.packetFlow {
for await packet in packetFlow { for await packet in packetFlow {
let nePacket = NEPacket(data: packet, protocolFamily: 2) let nePacket = NEPacket(data: packet, protocolFamily: 2)
await self.providerActor.writePackets(packets: [nePacket]) await self.providerActor.writePackets(packets: [nePacket])
@ -163,7 +163,7 @@ public class SDLContext {
public func stop() async { public func stop() async {
self.udpHole = nil self.udpHole = nil
self.noticeClientActor = nil self.noticeClient = nil
self.readTask?.cancel() self.readTask?.cancel()
} }
@ -248,8 +248,8 @@ public class SDLContext {
self.logger.log("[SDLContext] get registerSuperAck, aes_key len: \(aesKey.count)", level: .info) self.logger.log("[SDLContext] get registerSuperAck, aes_key len: \(aesKey.count)", level: .info)
// tun // tun
do { do {
let ipAddress = try await self.providerActor.setNetworkSettings(networkAddress: self.config.networkAddress, dnsServer: SDLDNSClientActor.Helper.dnsServer) let ipAddress = try await self.providerActor.setNetworkSettings(networkAddress: self.config.networkAddress, dnsServer: SDLDNSClient.Helper.dnsServer)
await self.noticeClientActor?.send(data: NoticeMessage.ipAdress(ip: ipAddress)) self.noticeClient?.send(data: NoticeMessage.ipAdress(ip: ipAddress))
self.startReader() self.startReader()
} catch let err { } catch let err {
@ -269,11 +269,11 @@ public class SDLContext {
switch errorCode { switch errorCode {
case .invalidToken, .nodeDisabled: case .invalidToken, .nodeDisabled:
let alertNotice = NoticeMessage.alert(alert: errorMessage) let alertNotice = NoticeMessage.alert(alert: errorMessage)
await self.noticeClientActor?.send(data: alertNotice) self.noticeClient?.send(data: alertNotice)
exit(-1) exit(-1)
case .noIpAddress, .networkFault, .internalFault: case .noIpAddress, .networkFault, .internalFault:
let alertNotice = NoticeMessage.alert(alert: errorMessage) let alertNotice = NoticeMessage.alert(alert: errorMessage)
await self.noticeClientActor?.send(data: alertNotice) self.noticeClient?.send(data: alertNotice)
} }
self.logger.log("[SDLContext] Get a SuperNak message exit", level: .warning) self.logger.log("[SDLContext] Get a SuperNak message exit", level: .warning)
@ -299,7 +299,7 @@ public class SDLContext {
case .networkShutdown(let shutdownEvent): case .networkShutdown(let shutdownEvent):
let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message) let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message)
await self.noticeClientActor?.send(data: alertNotice) self.noticeClient?.send(data: alertNotice)
exit(-1) exit(-1)
} }
} }
@ -434,10 +434,10 @@ public class SDLContext {
// //
private func dealPacket(packet: IPPacket) async { private func dealPacket(packet: IPPacket) async {
let networkAddr = self.config.networkAddress let networkAddr = self.config.networkAddress
if SDLDNSClientActor.Helper.isDnsRequestPacket(ipPacket: packet) { if SDLDNSClient.Helper.isDnsRequestPacket(ipPacket: packet) {
let destIp = packet.header.destination_ip let destIp = packet.header.destination_ip
self.logger.log("[DNSQuery] destIp: \(destIp), int: \(packet.header.destination.asIpAddress())", level: .debug) self.logger.log("[DNSQuery] destIp: \(destIp), int: \(packet.header.destination.asIpAddress())", level: .debug)
await self.dnsClientActor?.forward(ipPacket: packet) self.dnsClient?.forward(ipPacket: packet)
return return
} }
@ -503,7 +503,7 @@ public class SDLContext {
deinit { deinit {
self.udpHole = nil self.udpHole = nil
self.dnsClientActor = nil self.dnsClient = nil
} }
} }

View File

@ -10,8 +10,7 @@ import NIOCore
import NIOPosix import NIOPosix
// sn-server // sn-server
@available(macOS 14, *) final class SDLDNSClient {
actor SDLDNSClientActor {
private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1) private let group = MultiThreadedEventLoopGroup(numberOfThreads: 1)
private var channel: Channel? private var channel: Channel?
@ -58,7 +57,7 @@ actor SDLDNSClientActor {
} }
extension SDLDNSClientActor { extension SDLDNSClient {
private final class SDLDNSInboundHandler: ChannelInboundHandler { private final class SDLDNSInboundHandler: ChannelInboundHandler {
typealias InboundIn = AddressedEnvelope<ByteBuffer> typealias InboundIn = AddressedEnvelope<ByteBuffer>