# netforwarding **Repository Path**: ALONE_WORK/netforwarding ## Basic Information - **Project Name**: netforwarding - **Description**: 用于网口数据转发 - **Primary Language**: C++ - **License**: MPL-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-27 - **Last Updated**: 2026-03-27 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Network Forwarder 基于 Qt 的高性能网络转发服务,实现 UDP 组播转发与 TCP 双向代理。 ## 功能特性 - **UDP 组播转发**:eth0 接收组播数据,转发至 eth1 组播地址 - **UDP 应答转发**:eth1 接收五轴卡应答,转发回 CNC - **TCP 双向代理**:CNC 与五轴卡之间的透明 TCP 代理 - **TCP Keep-Alive**:自动检测并清理死连接(空闲 5s 探测,3 次失败断开) - **自动重连**:五轴卡地址变更时自动重连 - **跨平台支持**:Windows / Linux / 嵌入式系统 - **配置灵活**:JSON 配置文件 + 命令行参数 ## 系统架构 ``` ┌─────────────────────────────────────────┐ │ Network Forwarder │ │ │ CNC ────UDP────▶│ UDP1 (eth0) ───转发──▶ UDP2 (eth1) │────UDP───▶ 五轴卡 │ │ ▲ │ │ │ 记录CNC地址 │ 应答 │ │ ▼ │ │ │ ┌───────┐ ┌─────┴───┐ │ │ │提取五│◀─────────────│UDP应答 │◀────┘ │ │轴卡IP│ │接收 │ │ └───┬───┘ └─────────┘ │ │ │ ▼ CNC ◀───TCP────▶│ TCP Server ◀──代理──▶ TCP Client │────TCP───▶ 五轴卡 │ (监听端口) (主动连接) │ │ │ └─────────────────────────────────────────┘ ``` ## 工作流程 1. **组播接收**:UDP1 在 eth0 加入组播组 `224.0.0.88:9090`,接收 CNC 发送的组播数据 2. **组播转发**:将接收的数据通过 UDP2 在 eth1 转发到相同组播地址 3. **应答处理**:五轴卡收到组播后通过 UDP 单播回复,UDP2 接收应答 4. **地址提取**:从 UDP 应答中提取五轴卡 IP 地址 5. **TCP 建连**:当 CNC 通过 TCP 连接到转发器时,自动连接五轴卡 6. **双向代理**:CNC 与五轴卡之间的 TCP 数据透明转发 ## 环境要求 - Qt 5.5+ (支持 Qt 6.x) - C++11 或更高 - 支持平台:Windows / Linux / 嵌入式 Linux ## 编译 ### qmake ```bash # 创建 .pro 文件 cat > forwarder.pro << 'EOF' QT += network QT -= gui TARGET = forwarder CONFIG += console c++11 CONFIG -= app_bundle SOURCES += main_v2.cpp # Linux 链接选项 unix:LIBS += -lpthread EOF # 编译 qmake make ``` ### CMake ```bash # 创建 CMakeLists.txt cat > CMakeLists.txt << 'EOF' cmake_minimum_required(VERSION 3.10) project(forwarder) set(CMAKE_CXX_STANDARD 11) set(CMAKE_AUTOMOC ON) find_package(Qt5 COMPONENTS Network REQUIRED) add_executable(forwarder main_v2.cpp) target_link_libraries(forwarder Qt5::Network) EOF # 编译 mkdir build && cd build cmake .. make ``` ## 配置 ### 配置文件 (sys.json) ```json { "eth0": "eth0", "eth1": "eth1", "multicastAddress": "224.0.0.88", "multicastPort": 9090, "listenPort": 9494, "cardPort": 9494 } ``` ### 配置项说明 | 配置项 | 类型 | 默认值 | 说明 | |--------|------|--------|------| | `eth0` | string | `eth0` | 接收组播的网卡名称 | | `eth1` | string | `eth1` | 转发组播的网卡名称 | | `multicastAddress` | string | `224.0.0.88` | 组播地址(必须是有效组播地址) | | `multicastPort` | int | `9090` | 组播端口(1-65535) | | `listenPort` | int | `9494` | CNC TCP 监听端口 | | `cardPort` | int | `9494` | 五轴卡 TCP 端口 | ### 命令行参数 ```bash # 使用默认配置文件 (sys.json) ./forwarder # 指定配置文件 ./forwarder -c /path/to/config.json ./forwarder --config /etc/forwarder/config.json # 显示帮助 ./forwarder -h ./forwarder --help # 显示版本 ./forwarder -v ./forwarder --version ``` ## 运行 ### 前台运行 ```bash ./forwarder -c sys.json ``` ### 后台运行 (Linux) ```bash nohup ./forwarder -c /etc/forwarder/sys.json > /var/log/forwarder.log 2>&1 & ``` ### systemd 服务 (Linux) ```bash # 创建服务文件 sudo cat > /etc/systemd/system/forwarder.service << 'EOF' [Unit] Description=Network Forwarder Service After=network.target [Service] Type=simple ExecStart=/usr/local/bin/forwarder -c /etc/forwarder/sys.json Restart=always RestartSec=5 [Install] WantedBy=multi-user.target EOF # 启用并启动服务 sudo systemctl daemon-reload sudo systemctl enable forwarder sudo systemctl start forwarder ``` ## 日志输出 ### 日志格式 ``` [2024-01-15 10:30:45.123] [debug] [Forwarder] Config loaded: eth0=eth0, eth1=eth1 [2024-01-15 10:30:45.124] [info] [Forwarder] TCP proxy listening on 0.0.0.0:9494 [2024-01-15 10:30:50.456] [warning] [Forwarder] Card address changed: 192.168.1.100 -> 192.168.1.101 ``` ### 日志级别 - `debug`:详细调试信息(仅 Debug 构建) - `info`:正常运行信息 - `warning`:警告信息 - `critical`:严重错误 ### 采样日志 为避免高频日志影响性能,UDP 转发日志采用采样输出(每 100 条记录一次): ``` [Forwarder] Forwarded 100 multicast packets [Forwarder] Forwarded 200 multicast packets ... ``` ## 技术特性 ### TCP Keep-Alive 配置 | 参数 | 值 | 说明 | |------|-----|------| | 空闲时间 | 5 秒 | 连接空闲 5 秒后开始探测 | | 探测间隔 | 1 秒 | 每隔 1 秒发送一次探测包 | | 探测次数 | 3 次 | 连续 3 次无响应则断开连接 | ### 数据报限制 - UDP 数据报最大:64KB - 超出限制的数据报将被丢弃并记录警告 ### 并发安全 - 使用 `QMutex` 保护共享状态 - 锁范围最小化,避免 I/O 操作持锁 - 非递归锁设计,避免复杂嵌套 ### 资源管理 - Qt 对象树自动管理 Socket 生命周期 - `QPointer` 保护回调中的 `this` 指针 - 连接错误时自动清理并重置状态 ## 故障排查 ### 常见问题 #### 1. 组播无法接收 ```bash # 检查网卡是否存在 ip link show eth0 # 检查组播是否启用 ip link show eth0 | grep MULTICAST # 检查防火墙 sudo iptables -L -n | grep 9090 ``` #### 2. TCP 连接失败 ```bash # 检查端口是否被占用 netstat -tlnp | grep 9494 # 检查五轴卡是否可达 ping <五轴卡IP> telnet <五轴卡IP> 9494 ``` #### 3. 配置文件加载失败 ```bash # 检查文件权限 ls -la sys.json # 检查 JSON 格式 python3 -m json.tool sys.json ``` ### 调试模式 ```bash # Debug 构建会输出更多日志 qmake CONFIG+=debug make ./forwarder ``` ## 性能优化建议 1. **网卡亲和性**:将不同网卡绑定到不同 CPU 核心 2. **缓冲区大小**:增大系统网络缓冲区 ```bash # Linux sysctl -w net.core.rmem_max=16777216 sysctl -w net.core.wmem_max=16777216 ``` 3. **关闭调试日志**:Release 构建自动关闭 `LOG_DEBUG` ## 许可证 MIT License ## 版本历史 | 版本 | 日期 | 变更 | |------|------|------| | 1.0.1 | 2026-03-27 | 重构:跨平台支持、TCP Keep-Alive、代码审查修复 | | 1.0.0 | 2026-03-25 | 初始版本 |