当前位置: 首页 > news >正文

tcpfwd-doc

tcpfwd — TCP 端口转发 (nostdlib ARM)

2026/7/2

基本信息

项目
源文件tcpfwd.c(248 行)
编译产物tcpfwd(1864 bytes)
目标平台ZTE UZ901 热点 (ARMv7, Linux 3.4.110)
工具链arm-linux-gnueabihf-gcc -static -nostdlib -Os -s
工作目录/tmp/(RAM) 或/mnt/userdata/(JFFS2)

架构

┌──────────┐ TCP ┌──────────┐ TCP ┌──────────┐ │ Client │ ←────────→ │ tcpfwd │ ←────────→ │ Target │ │ (browser)│ listen │ (hotspot)│ connect │ (server) │ └──────────┘ port └──────────┘ ip:port └──────────┘

单线程、同步阻塞 poll 模型。每个连接串行处理(接受 → 转发 → 关闭 → 下一个)。

源码结构

1. 数据类型 (17-28行)

structsockaddr_in{shortsin_family;ushort sin_port;uint sin_addr;charpad[8];};structpollfd{intfd;shortevents;shortrevents;};

2. Syscall 包装层 (30-56行)

ARM EABI 纯内联汇编,r7传 syscall 号,r0-r4传参数。

staticlongs5(longn,longa0,longa1,longa2,longa3,longa4){registerlongr0asm("r0")=a0;registerlongr1asm("r1")=a1;registerlongr2asm("r2")=a2;registerlongr3asm("r3")=a3;registerlongr4asm("r4")=a4;registerlongr7asm("r7")=n;asmvolatile("svc #0":"+r"(r0):"r"(r1),"r"(r2),"r"(r3),"r"(r4),"r"(r7):"memory","cc");returnr0;}

简化宏:

  • s3(n,a0,a1,a2)→ 3 参数 syscall
  • s2(n,a0,a1)→ 2 参数 syscall
  • s1(n,a0)→ 1 参数 syscall

Syscall 映射

编号说明
exit(n)1退出
read(f,b,l)3读文件/套接字
write(f,b,l)4写文件/套接字
open(p,f,m)5打开文件
close(fd)6关闭 fd
poll(f,n,t)168IO 多路复用
socket(d,t,p)281创建套接字
bind(f,a,l)282绑定端口
connect(f,a,l)283连接目标
listen(f,b)284监听
accept(f,a,l)285接受连接
setsockopt(f,l,o,v,s)294设置选项

3. 工具函数 (58-93行)

  • writestr(fd, s)— 写字符串到 fd(自动计算长度)
  • htons(x)— 主机序转网络序(大小端交换)
  • parse_ip(out, pp)— 解析 IP 字符串 “1.2.3.4” →u32
  • parse_port(pp)— 解析端口字符串 “8080” →int
  • skip_spaces(pp)— 跳过空白字符

4. 转发核心 proxy_loop (95-142行)

staticvoidproxy_loop(intcfd,inttfd){charbuf[4096];while(1){structpollfdpfds[2];// 监视两个 fdpfds[0]={cfd,POLLIN};pfds[1]={tfd,POLLIN};intr=poll(pfds,2,-1);// 阻塞等待if(r<=0)break;// 检查错误事件if(pfds[0].revents&(POLLERR|POLLHUP|POLLNVAL))break;if(pfds[1].revents&(POLLERR|POLLHUP|POLLNVAL))break;// client → targetif(pfds[0].revents&POLLIN){r=read(cfd,buf,sizeof(buf));if(r<=0)break;// 全部写出(处理短写)char*bp=buf;intleft=r;while(left>0){intw=write(tfd,bp,left);if(w<=0)break;bp+=w;left-=w;}if(left>0)break;}// target → client (同上)if(pfds[1].revents&POLLIN){...}// 一方关闭后 break 并 close 两个 fd}close(cfd);close(tfd);}

关键设计:

  • 单 4KB 缓冲区,两个方向共用(串行 poll,不会同时读写)
  • while (left > 0)循环处理短写(write 可能未写完所有字节)
  • 任何方向 read ≤ 0 或 write ≤ 0 都断开整个连接
  • poll 超时 -1(无限等待)

5. 入口 _start (144-247行)

_start ├── open("/tmp/tcpfwd.conf", O_RDONLY) ├── read 配置 (最大 512 字节) ├── parse: 跳过 # 注释和空行 │ └── listen_port target_ip target_port ├── socket → bind → listen ├── writestr("tcpfwd: running\n") └── loop: ├── accept → 新 client fd ├── socket → connect target ├── proxy_loop(cfd, tfd) └── 断开后回到 accept

配置格式

/tmp/tcpfwd.conf:

8080 192.168.1.100 3000 # 或带注释: # 转发热点 8080 → 内网服务器 3000
  • 只解析第一行有效规则
  • 支持#行注释
  • 支持空行

编译

arm-linux-gnueabihf-gcc-static-nostdlib-Os-s\-otcpfwd tcpfwd.c

或使用 WSL:

/opt/arm-linux-musleabihf-cross/bin/arm-linux-musleabihf-gcc\-static-nostdlib-Os-s-mfloat-abi=soft\-otcpfwd tcpfwd.c

部署

adb push tcpfwd /tmp/ adb shellchmod+x /tmp/tcpfwdecho"8080 192.168.1.100 3000"|adb shelltee/tmp/tcpfwd.conf adb shell"/tmp/tcpfwd &"

限制

限制说明
单连接串行一次只能转发一个连接,完成后才 accept 下一个
无 fork/线程无法并发处理多个连接
无超时poll(-1) 永久阻塞,僵尸连接不回收
4KB 缓冲区超过 4KB 报文需多次 poll 转发
单规则config 只读第一条规则
config 512B文件最大 512 字节
硬编码路径config 只读/tmp/tcpfwd.conf

已知 Bug

  1. config 路径混淆: 头注释写/mnt/userdata/tcpfwd.conf,代码写/tmp/tcpfwd.conf
  2. 无 SO_REUSEADDR 效果: 设置了 reuse 但连接断开后有 TIME_WAIT 问题
  3. accept 空地址: 第二个参数传 0,无法知道客户端 IP
  4. gcc register asm:s5使用register asm("rX")-Os下跨函数调用可能被优化出错(GCC 11 已知问题)

文档日期: 2026-07-02
相关文件: 已删除

http://www.cnnetsun.cn/news/3878981.html

相关文章:

  • 2026年手机存储成本飙升致涨价,行业增长引擎转向单价
  • Windows窗口置顶神器:AlwaysOnTop终极效率解决方案
  • Wand-Enhancer:3步免费解锁WeMod Pro全部特权,手机也能控制游戏模组
  • 嵌入式串口通信:从轮询卡死到中断驱动的实战解析
  • ScienceDecrypting:永久解除科学文库PDF阅读限制的完整指南
  • 在贵阳做企业,为什么你的**贵阳手机网站建设**必须懂人性?这几点不做就是扔钱,老站长掏心窝子告诉你真相
  • 计算机操作系统19,20
  • 恋活!HF Patch终极指南:200+插件一键安装,解锁完整汉化与游戏增强功能
  • M4Markets评测类:用路径方式看用户体验路径 形成更稳的判断
  • 2026年pdf拆分工具免费盘点:七款合并与拆分工具实测,在线和本地怎么选
  • 2024年企业必须执行的网站改版建设方案:从流量到留量的全链路优化指南
  • 美育积累可有可无?审美素养影响孩子终身气质
  • 阻塞和非阻塞
  • 零基础逆袭成为Web全栈工程师:选择北京网站建设培训班开启高薪职业转型之路
  • 零基础想转行网安,这份白帽黑客成长路线图请收好
  • 2024年深度解析网站建设需要注意哪些核心细节以确保商业成功
  • DeepSeek LeetCode 3841. 查询树上回文路径 Java实现
  • 如何选择优质的网站建设招标方案以打造高转化率数字化营销入口并避开隐形陷阱
  • 长沙3合1网站建设如何助力中小企业低成本实现数字化转型与高效获客全攻略
  • 门户网站建设目标:如何构建真正具备商业价值与用户体验的数字化入口平台
  • 揭秘电子商务网站建设价格真相:避坑指南与隐形成本全解析
  • 心理综评容易失分?常态化心理培育助力身心成长
  • 郑州品牌网站建设怎么做才真正有用:揭秘中小企业如何通过官网提升转化率
  • PyTorch 2.0实战:5个核心代码模块与模型训练全流程解析
  • 工业模拟测量与控制技术详解:02 工业模拟信号体系
  • 为什么scrcpy成为Android投屏的终极解决方案:完整实战指南
  • 【高清视频】还有这么轻量级的工具可以一次看清PCIe总线接口上的PERST#等所有边带信号?!
  • 留学生冲刺顶级资管:如何突破语言优势与偏好壁垒?
  • 襄阳网站建设公司如何帮本地企业打造高转化官网:避开这5个坑,让流量变销量
  • AMD ROCm GPU性能优化深度解析:3种系统化调优方法实现AI与HPC应用加速