diff --git a/Tun/Punchnet/Actors/SDLContextActor.swift b/Tun/Punchnet/Actors/SDLContextActor.swift index 9339d17..65bd4a3 100644 --- a/Tun/Punchnet/Actors/SDLContextActor.swift +++ b/Tun/Punchnet/Actors/SDLContextActor.swift @@ -521,8 +521,7 @@ actor SDLContextActor { } if let stunData = try? stunRequest.serializedData() { - let remoteAddress = self.config.stunSocketAddress - self.sendHolePacket(type: .stunRequest, data: stunData, remoteAddress: remoteAddress) + self.sendSuperPacket(type: .stunRequest, data: stunData) } } @@ -609,12 +608,12 @@ actor SDLContextActor { if sendRegisterEvent.natIp > 0 && sendRegisterEvent.natPort > 0 { let address = SDLUtil.int32ToIp(sendRegisterEvent.natIp) if let remoteAddress = try? SocketAddress.makeAddressResolvingHost(address, port: Int(sendRegisterEvent.natPort)) { - self.sendHolePacket(type: .register, data: registerData, remoteAddress: remoteAddress) + self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress) } } if sendRegisterEvent.hasV6Info, let remoteAddress = try? await sendRegisterEvent.v6Info.socketAddress() { - self.sendHolePacket(type: .register, data: registerData, remoteAddress: remoteAddress) + self.sendPeerPacket(type: .register, data: registerData, remoteAddress: remoteAddress) } case .shutdown(let shutdownEvent): let alertNotice = NoticeMessage.alert(alert: shutdownEvent.message) @@ -659,7 +658,7 @@ actor SDLContextActor { registerAck.srcMac = networkAddr.mac registerAck.dstMac = register.srcMac - self.sendHolePacket(type: .registerAck, data: try registerAck.serializedData(), remoteAddress: remoteAddress) + self.sendPeerPacket(type: .registerAck, data: try registerAck.serializedData(), remoteAddress: remoteAddress) // 这里需要建立到来源的会话, 在复杂网络下,通过super-node查询到的nat地址不一定靠谱,需要通过udp包的来源地址作为nat地址 let session = Session(dstMac: register.srcMac, natAddress: remoteAddress) self.sessionManager.addSession(session: session) @@ -912,18 +911,18 @@ actor SDLContextActor { // 广播地址不要去尝试打洞 if ARPPacket.isBroadcastMac(dstMac) { // 通过super_node进行转发 - self.sendHolePacket(type: .data, data: data, remoteAddress: self.config.stunSocketAddress) + self.sendSuperPacket(type: .data, data: data) } else { // 通过session发送到对端 if let session = self.sessionManager.getSession(toAddress: dstMac) { SDLLogger.log("[SDLContext] step 5 send packet by session: \(session)", for: .trace) - self.sendHolePacket(type: .data, data: data, remoteAddress: session.natAddress) + self.sendPeerPacket(type: .data, data: data, remoteAddress: session.natAddress) self.flowTracer.inc(num: data.count, type: .p2p) } else { // 通过super_node进行转发 - self.sendHolePacket(type: .data, data: data, remoteAddress: self.config.stunSocketAddress) + self.sendSuperPacket(type: .data, data: data) SDLLogger.log("[SDLContext] step 5 send packet by super: \(self.config.stunSocketAddress)", for: .trace) // 流量统计 self.flowTracer.inc(num: data.count, type: .forward) @@ -986,8 +985,13 @@ actor SDLContextActor { SDLLogger.log("[SDLContext] nat_type is: \(natType)") } - // 发送hole的数据 - private func sendHolePacket(type: SDLPacketType, data: Data, remoteAddress: SocketAddress) { + // 发送给super/stun节点的数据 + private func sendSuperPacket(type: SDLPacketType, data: Data) { + self.udpHole?.send(type: type, data: data, remoteAddress: self.config.stunSocketAddress) + } + + // 发送给peer的数据 + private func sendPeerPacket(type: SDLPacketType, data: Data, remoteAddress: SocketAddress) { switch remoteAddress { case .v4: self.udpHole?.send(type: type, data: data, remoteAddress: remoteAddress)