仓库地址: https://github.com/zephyrchien/ZTUN
写这个程序的起因是realm不支持零拷贝,当初想着如果要给realm实现零拷贝,不如用C++重新写一个。于是我就尝试着写了一下。。目前仍处于重度施工中(还没实现timer和dns resolver, 连Readme都还没写),发出来是希望感兴趣的同学先帮我测个速
本地iperf3简单测速结果:
使用buffer时速度跟realm相当(15G/s)
使用pipe时(零拷贝)速度跟Go程序差不多(40G/s)
快速开始:
本程序没有外部依赖(EDIT: 除了glibc),直接把代码下载下来编译就行了:
- git clone https://github.com/zephyrchien/ZTUN
cd ZTUN && mkdir build && cd build
cmake ..
make
复制代码
用命令行参数输入一对地址,或者指定配置文件:
- ztun -l :5000 -r 1.1.1.1:443 # 省略本地ip,默认为0.0.0.0
ztun -c ztun.conf
复制代码
配置文件格式:
- # comment, starting with #
# set log level and output path
# level = none|warn|info|debug, default is info
# file = filename, default is stderr
log_level = info
#log_file = ztun.log
# group1
local = :5000
remote = 1.1.1.1:443
# group2
local = :10000
remote = 2.2.2.2:8080
# and more...
复制代码
附Golang程序示例:
- package main
import (
"net"
"sync"
"io"
)
func main() {
lis,_:=net.Listen("tcp","127.0.0.1:15000")
for {
conn,_:=lis.Accept()
go handle(conn)
}
}
func handle(conn net.Conn) {
conn2,_:=net.Dial("tcp","127.0.0.1:20000")
var wg sync.WaitGroup
wg.Add(2)
go func() {
defer conn.Close()
defer conn2.Close()
io.Copy(conn,conn2)
wg.Done()
}()
go func() {
defer conn.Close()
defer conn2.Close()
io.Copy(conn2,conn)
wg.Done()
}()
wg.Wait()
}
复制代码
热议
2楼 h20
没有外部依赖?glibc不算?
3楼 dunce
= =也就glibc了,毕竟不用特地去装
4楼 xuliliang
前排占位出售啤酒花生瓜子饮料
5楼 fatal
还是socat吧。。。
6楼 lovecan
支持下
7楼 POMAH
习惯了socat,先mark一下。
8楼 110e
mark一下