This commit is contained in:
anlicheng 2026-01-27 23:13:41 +08:00
parent 715fa6f491
commit fe680b31b2
3 changed files with 39 additions and 18 deletions

View File

@ -8,6 +8,7 @@
import Foundation import Foundation
import NIOCore import NIOCore
import NIOPosix import NIOPosix
import SwiftProtobuf
// sn-server // sn-server
actor SDLUDPHoleActor { actor SDLUDPHoleActor {
@ -204,7 +205,6 @@ actor SDLUDPHoleActor {
} }
return .peerInfo(peerInfo) return .peerInfo(peerInfo)
case .event: case .event:
guard let eventVal = buffer.readInteger(as: UInt8.self), guard let eventVal = buffer.readInteger(as: UInt8.self),
let event = SDLEventType(rawValue: eventVal), let event = SDLEventType(rawValue: eventVal),

View File

@ -149,6 +149,7 @@ public class SDLContext {
private func startUDPHole() async throws { private func startUDPHole() async throws {
self.udpHoleActor = try await SDLUDPHoleActor(logger: self.logger) self.udpHoleActor = try await SDLUDPHoleActor(logger: self.logger)
try await withThrowingTaskGroup(of: Void.self) { group in try await withThrowingTaskGroup(of: Void.self) { group in
group.addTask { group.addTask {
try await self.udpHoleActor?.start() try await self.udpHoleActor?.start()
@ -160,20 +161,19 @@ public class SDLContext {
try await Task.sleep(nanoseconds: 5 * 1_000_000_000) try await Task.sleep(nanoseconds: 5 * 1_000_000_000)
try Task.checkCancellation() try Task.checkCancellation()
// TODO if let udpHoleActor = self.udpHoleActor {
// if let udpHoleActor = self.udpHoleActor { let cookie = await udpHoleActor.getCookieId()
// let cookie = await udpHoleActor.getCookieId() var stunRequest = SDLStunRequest()
// var stunRequest = SDLStunRequest() stunRequest.clientID = self.config.clientId
// stunRequest.clientID = self.config.clientId stunRequest.networkID = self.config.networkAddress.networkId
// stunRequest.networkID = self.devAddr.networkID stunRequest.ip = self.config.networkAddress.ip
// stunRequest.ip = self.devAddr.netAddr stunRequest.mac = self.config.networkAddress.mac
// stunRequest.mac = self.devAddr.mac stunRequest.natType = UInt32(self.natType.rawValue)
// stunRequest.natType = UInt32(self.natType.rawValue)
// let remoteAddress = self.config.stunSocketAddress
// let remoteAddress = self.config.stunSocketAddress await udpHoleActor.send(type: .stunRequest, data: try stunRequest.serializedData(), remoteAddress: remoteAddress)
// await udpHoleActor.send(type: .stunRequest, data: try stunRequest.serializedData(), remoteAddress: remoteAddress) self.lastCookie = cookie
// self.lastCookie = cookie }
// }
} }
} }
@ -181,6 +181,28 @@ public class SDLContext {
if let messageStream = self.udpHoleActor?.messageStream { if let messageStream = self.udpHoleActor?.messageStream {
for try await (remoteAddress, message) in messageStream { for try await (remoteAddress, message) in messageStream {
try Task.checkCancellation() try Task.checkCancellation()
switch message {
case .registerSuperAck(let registerSuperAck):
await self.handleRegisterSuperAck(registerSuperAck: registerSuperAck)
case .registerSuperNak(let registerSuperNak):
await self.handleRegisterSuperNak(nakPacket: registerSuperNak)
case .peerInfo(let peerInfo):
()
case .event(let event):
try await self.handleEvent(event: event)
case .stunReply(let stunReply):
await self.handleStunReply(stunReply: stunReply)
case .stunProbeReply(_):
()
case .data(let data):
try await self.handleData(data: data)
case .register(let register):
try await self.handleRegister(remoteAddress: remoteAddress, register: register)
case .registerAck(let registerAck):
await self.handleRegisterAck(remoteAddress: remoteAddress, registerAck: registerAck)
default:
self.logger.log("get unknown message: \(message)", level: .error)
}
} }
} }
} }
@ -254,6 +276,7 @@ public class SDLContext {
//// return //// return
//// } //// }
/// ///
private func handleRegisterSuperAck(registerSuperAck: SDLRegisterSuperAck) async { private func handleRegisterSuperAck(registerSuperAck: SDLRegisterSuperAck) async {
// rsa // rsa
let aesKey = try! self.rsaCipher.decode(data: Data(registerSuperAck.aesKey)) let aesKey = try! self.rsaCipher.decode(data: Data(registerSuperAck.aesKey))
@ -345,7 +368,7 @@ public class SDLContext {
} }
} }
private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegister) async { private func handleRegisterAck(remoteAddress: SocketAddress, registerAck: SDLRegisterAck) async {
// tun, // tun,
let networkAddr = config.networkAddress let networkAddr = config.networkAddress
if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId { if registerAck.dstMac == networkAddr.mac && registerAck.networkID == networkAddr.networkId {

View File

@ -104,8 +104,6 @@ enum SDLHoleInboundMessage {
case registerSuperNak(SDLRegisterSuperNak) case registerSuperNak(SDLRegisterSuperNak)
case peerInfo(SDLPeerInfo) case peerInfo(SDLPeerInfo)
case pong
case event(SDLEvent) case event(SDLEvent)
case stunReply(SDLStunReply) case stunReply(SDLStunReply)