解决HoleMessage的解析问题
This commit is contained in:
parent
f839a5dd11
commit
7cf9d1afc1
@ -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 {
|
||||
// 欢迎消息
|
||||
|
||||
96
Tun/Punchnet/UDPHole/SDLHoleMessage.swift
Normal file
96
Tun/Punchnet/UDPHole/SDLHoleMessage.swift
Normal file
@ -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
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@ -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)
|
||||
@ -146,51 +145,6 @@ final class SDLUDPHole: 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("SDLUDPHole decode miss type: \(type)", for: .debug)
|
||||
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
private func finishMessageStream() {
|
||||
guard !self.didFinishMessageStream else {
|
||||
return
|
||||
@ -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
|
||||
Loading…
x
Reference in New Issue
Block a user