[半成品][C++]TCP转发工具-dunce

仓库地址: 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一下

发表评论