From 7cf9d1afc1335aa2fedb257b0578f8c556ca6cc0 Mon Sep 17 00:00:00 2001 From: anlicheng <244108715@qq.com> Date: Wed, 15 Apr 2026 17:23:01 +0800 Subject: [PATCH] =?UTF-8?q?=E8=A7=A3=E5=86=B3HoleMessage=E7=9A=84=E8=A7=A3?= =?UTF-8?q?=E6=9E=90=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Tun/Punchnet/Protobuf/SDLMessage.swift | 37 ------- Tun/Punchnet/UDPHole/SDLHoleMessage.swift | 96 +++++++++++++++++++ Tun/Punchnet/{ => UDPHole}/SDLUDPHole.swift | 48 +--------- Tun/Punchnet/{ => UDPHole}/SDLUDPHoleV6.swift | 47 +-------- 4 files changed, 98 insertions(+), 130 deletions(-) create mode 100644 Tun/Punchnet/UDPHole/SDLHoleMessage.swift rename Tun/Punchnet/{ => UDPHole}/SDLUDPHole.swift (73%) rename Tun/Punchnet/{ => UDPHole}/SDLUDPHoleV6.swift (72%) diff --git a/Tun/Punchnet/Protobuf/SDLMessage.swift b/Tun/Punchnet/Protobuf/SDLMessage.swift index 8182f35..a2e3d2b 100644 --- a/Tun/Punchnet/Protobuf/SDLMessage.swift +++ b/Tun/Punchnet/Protobuf/SDLMessage.swift @@ -123,43 +123,6 @@ extension SDLStunProbeReply { } } -// --MARK: 进来的消息, 这里需要采用代数类型来表示 -enum SDLHoleMessage { - case data(SDLData) - case register(SDLRegister) - case registerAck(SDLRegisterAck) - case stunProbeReply(SDLStunProbeReply) - case stunReply(SDLStunReply) -} - -enum SDLHoleControlMessage { - case register(SDLRegister) - case registerAck(SDLRegisterAck) - case stunProbeReply(SDLStunProbeReply) - case stunReply(SDLStunReply) -} - -enum SDLHoleInboundMessage { - case control(SDLHoleControlMessage) - case data(SDLData) -} - -extension SDLHoleMessage { - var inboundMessage: SDLHoleInboundMessage { - switch self { - case .data(let data): - return .data(data) - case .register(let register): - return .control(.register(register)) - case .registerAck(let registerAck): - return .control(.registerAck(registerAck)) - case .stunProbeReply(let stunProbeReply): - return .control(.stunProbeReply(stunProbeReply)) - case .stunReply(let stunReply): - return .control(.stunReply(stunReply)) - } - } -} enum SDLQUICInboundMessage { // 欢迎消息 diff --git a/Tun/Punchnet/UDPHole/SDLHoleMessage.swift b/Tun/Punchnet/UDPHole/SDLHoleMessage.swift new file mode 100644 index 0000000..f32f5fd --- /dev/null +++ b/Tun/Punchnet/UDPHole/SDLHoleMessage.swift @@ -0,0 +1,96 @@ +// +// SDLHoleMessageDecoder.swift +// punchnet +// +// Created by 安礼成 on 2026/4/15. +// +import Foundation +import NIOCore +import NIOPosix +import SwiftProtobuf + +// --MARK: 进来的消息, 这里需要采用代数类型来表示 +enum SDLHoleMessage { + case data(SDLData) + case register(SDLRegister) + case registerAck(SDLRegisterAck) + case stunProbeReply(SDLStunProbeReply) + case stunReply(SDLStunReply) +} + +enum SDLHoleControlMessage { + case register(SDLRegister) + case registerAck(SDLRegisterAck) + case stunProbeReply(SDLStunProbeReply) + case stunReply(SDLStunReply) +} + +enum SDLHoleInboundMessage { + case control(SDLHoleControlMessage) + case data(SDLData) +} + +extension SDLHoleMessage { + var inboundMessage: SDLHoleInboundMessage { + switch self { + case .data(let data): + return .data(data) + case .register(let register): + return .control(.register(register)) + case .registerAck(let registerAck): + return .control(.registerAck(registerAck)) + case .stunProbeReply(let stunProbeReply): + return .control(.stunProbeReply(stunProbeReply)) + case .stunReply(let stunReply): + return .control(.stunReply(stunReply)) + } + } +} + +extension SDLHoleMessage { + + static func decode(buffer: inout ByteBuffer) throws -> SDLHoleMessage? { + guard let type = buffer.readInteger(as: UInt8.self), + let packetType = SDLPacketType(rawValue: type) else { + return nil + } + + switch packetType { + case .data: + guard let bytes = buffer.readBytes(length: buffer.readableBytes), + let dataPacket = try? SDLData(serializedBytes: bytes) else { + return nil + } + return .data(dataPacket) + case .register: + guard let bytes = buffer.readBytes(length: buffer.readableBytes), + let registerPacket = try? SDLRegister(serializedBytes: bytes) else { + return nil + } + return .register(registerPacket) + case .registerAck: + guard let bytes = buffer.readBytes(length: buffer.readableBytes), + let registerAck = try? SDLRegisterAck(serializedBytes: bytes) else { + return nil + } + return .registerAck(registerAck) + case .stunProbeReply: + guard let bytes = buffer.readBytes(length: buffer.readableBytes), + let stunProbeReply = try? SDLStunProbeReply(serializedBytes: bytes) else { + return nil + } + return .stunProbeReply(stunProbeReply) + case .stunReply: + guard let bytes = buffer.readBytes(length: buffer.readableBytes), + let stunReply = try? SDLStunReply(serializedBytes: bytes) else { + return nil + } + return .stunReply(stunReply) + default: + SDLLogger.log("[SDLUDPHole] decode miss type: \(type)", for: .debug) + + return nil + } + } + +} diff --git a/Tun/Punchnet/SDLUDPHole.swift b/Tun/Punchnet/UDPHole/SDLUDPHole.swift similarity index 73% rename from Tun/Punchnet/SDLUDPHole.swift rename to Tun/Punchnet/UDPHole/SDLUDPHole.swift index 30a4c58..30c7341 100644 --- a/Tun/Punchnet/SDLUDPHole.swift +++ b/Tun/Punchnet/UDPHole/SDLUDPHole.swift @@ -4,7 +4,6 @@ // // Created by 安礼成 on 2024/1/31. // - import Foundation import NIOCore import NIOPosix @@ -103,7 +102,7 @@ final class SDLUDPHole: ChannelInboundHandler { } do { - if let message = try decode(buffer: &buffer) { + if let message = try SDLHoleMessage.decode(buffer: &buffer) { self.messageContinuation.yield((remoteAddress, message)) } else { SDLLogger.log("[SDLUDPHole] decode message, get null", for: .debug) @@ -145,52 +144,7 @@ final class SDLUDPHole: ChannelInboundHandler { channel.writeAndFlush(envelope, promise: nil) } } - - // --MARK: 编解码器 - private func decode(buffer: inout ByteBuffer) throws -> SDLHoleMessage? { - guard let type = buffer.readInteger(as: UInt8.self), - let packetType = SDLPacketType(rawValue: type) else { - return nil - } - switch packetType { - case .data: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let dataPacket = try? SDLData(serializedBytes: bytes) else { - return nil - } - return .data(dataPacket) - case .register: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let registerPacket = try? SDLRegister(serializedBytes: bytes) else { - return nil - } - return .register(registerPacket) - case .registerAck: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let registerAck = try? SDLRegisterAck(serializedBytes: bytes) else { - return nil - } - return .registerAck(registerAck) - case .stunProbeReply: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let stunProbeReply = try? SDLStunProbeReply(serializedBytes: bytes) else { - return nil - } - return .stunProbeReply(stunProbeReply) - case .stunReply: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let stunReply = try? SDLStunReply(serializedBytes: bytes) else { - return nil - } - return .stunReply(stunReply) - default: - SDLLogger.log("SDLUDPHole decode miss type: \(type)", for: .debug) - - return nil - } - } - private func finishMessageStream() { guard !self.didFinishMessageStream else { return diff --git a/Tun/Punchnet/SDLUDPHoleV6.swift b/Tun/Punchnet/UDPHole/SDLUDPHoleV6.swift similarity index 72% rename from Tun/Punchnet/SDLUDPHoleV6.swift rename to Tun/Punchnet/UDPHole/SDLUDPHoleV6.swift index 32674ce..907225d 100644 --- a/Tun/Punchnet/SDLUDPHoleV6.swift +++ b/Tun/Punchnet/UDPHole/SDLUDPHoleV6.swift @@ -102,7 +102,7 @@ final class SDLUDPHoleV6: ChannelInboundHandler { } do { - if let message = try decode(buffer: &buffer) { + if let message = try SDLHoleMessage.decode(buffer: &buffer) { self.messageContinuation.yield((remoteAddress, message)) } else { SDLLogger.log("[SDLUDPHoleV6] decode message, get null", for: .debug) @@ -143,51 +143,6 @@ final class SDLUDPHoleV6: ChannelInboundHandler { } } - // --MARK: 编解码器 - private func decode(buffer: inout ByteBuffer) throws -> SDLHoleMessage? { - guard let type = buffer.readInteger(as: UInt8.self), - let packetType = SDLPacketType(rawValue: type) else { - return nil - } - - switch packetType { - case .data: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let dataPacket = try? SDLData(serializedBytes: bytes) else { - return nil - } - return .data(dataPacket) - case .register: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let registerPacket = try? SDLRegister(serializedBytes: bytes) else { - return nil - } - return .register(registerPacket) - case .registerAck: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let registerAck = try? SDLRegisterAck(serializedBytes: bytes) else { - return nil - } - return .registerAck(registerAck) - case .stunProbeReply: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let stunProbeReply = try? SDLStunProbeReply(serializedBytes: bytes) else { - return nil - } - return .stunProbeReply(stunProbeReply) - case .stunReply: - guard let bytes = buffer.readBytes(length: buffer.readableBytes), - let stunReply = try? SDLStunReply(serializedBytes: bytes) else { - return nil - } - return .stunReply(stunReply) - default: - SDLLogger.log("SDLUDPHoleV6 decode miss type: \(type)", for: .debug) - - return nil - } - } - private func finishMessageStream() { guard !self.didFinishMessageStream else { return