fix actor
This commit is contained in:
parent
2abef3d0bf
commit
5bb971bef3
@ -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 (ip地址和port都变的情况)
|
// step3: ip2:port2 <---- ip1:port1 (ip地址和port都变的情况)
|
||||||
// 如果能收到的,说明是完全锥形 说明是IP地址限制锥型NAT,如果不能收到说明是端口限制锥型。
|
// 如果能收到的,说明是完全锥形 说明是IP地址限制锥型NAT,如果不能收到说明是端口限制锥型。
|
||||||
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改变情况)
|
||||||
// 如果能收到的说明是IP地址限制锥型NAT,如果不能收到说明是端口限制锥型。
|
// 如果能收到的说明是IP地址限制锥型NAT,如果不能收到说明是端口限制锥型。
|
||||||
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 {
|
||||||
|
|||||||
@ -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>
|
||||||
@ -47,7 +47,7 @@ public class SDLContext {
|
|||||||
var providerActor: SDLTunnelProviderActor
|
var providerActor: SDLTunnelProviderActor
|
||||||
var puncherActor: SDLPuncherActor
|
var puncherActor: SDLPuncherActor
|
||||||
// dns的client对象
|
// dns的client对象
|
||||||
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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -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>
|
||||||
Loading…
x
Reference in New Issue
Block a user