基于tox安全P2P网络的TCP tunnel实现。
go get -u github.com/envsh/go-toxcore
go get -u github.com/cyfdecyf/color
go get -u github.com/bitly/go-simplejson
go get -u github.com/GianlucaGuarini/go-observable
go get -u github.com/go-ini/ini
go get -u github.com/tatsushid/go-fastping
go get -u golang.org/x/net/icmp
go get -u github.com/envsh/toxtun
或者,
git clone https://github.com/envsh/toxtun
cd toxtun
go build -v
toxtun server
编辑toxtun.ini配置文件,把启动server端时的toxid写入配置文件,
[server]
name = whttpd
[client]
toxtun1 = *:81:127.0.0.1:8181:A5A02FECA08E3EAC7E646B89C0507A8AAF9136E05DC756FF09F86230951820670F908F2E7719
toxtun2 = *:82:127.0.0.1:8282:6BA28AC06C1D57783FE017FA9322D0B356E61404C92155A04F64F3B19C75633E8BDDEFFA4856
注:目前只能使用第一个tunnel配置项。
启动客户端:
toxtun -config toxtun.ini client
每个连接分布一个KCP。所以,KCP创建需要一个协商过程。
KCP+tox(lossy packet)默认配置:100K+/s
开启KCP NoDelay模式后:560K/s (调整kcp update interval)
测试情况说明,youtube视频连续播放测试1天,传输视频数据3G。
由于有回调的事件模式,会涉及多线程的数据结构操作,因此要考虑线程同步问题,否则出现一些程序崩溃问题。
第一种,全部使用同一线程,其他线程的数据库通过channel传递到该事件处理线程(主线程)进行处理。
要注意,已经在同一线程中的操作不需要再通过channel发送事件,
这样更直接,也更不容易导致多channel的死锁问题。
客户端goroutine个数,main+tox+kcp+client*n+check connect timeout
服务端goroutine个数,main+tox+kcp+client*n
第二种,使用锁,对产生多线程操作冲突的代码通过锁来同步。(已弃用)
虽然可以直接用tox的lossless packet,但仍旧要加一层KCP,因为toxnet可能暂时性掉线(offline)。
在这种情况下,如果有活动连接和数据包,则要考虑自己处理重发。
git checkout -b my-new-feature
)git commit -am 'Add some feature'
)git push origin my-new-feature
)