Skip to content

Commit

Permalink
Tcp多路复用
Browse files Browse the repository at this point in the history
  • Loading branch information
刘河 committed Jan 5, 2019
1 parent ade3bb0 commit 9bec536
Show file tree
Hide file tree
Showing 14 changed files with 271 additions and 187 deletions.
6 changes: 3 additions & 3 deletions conf/tasks.csv
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
0,hostServer,,ts08z6vk5nc72fs8,aaa,bbb,,1,0
0,hostServer,,7n7bxc2bm1fyjfab,a,b,,1,0
8001,tunnelServer,127.0.0.1:88,jq5i7n0sjs1h0jje,aaa,bbb,,1,1
8001,tunnelServer,127.0.0.1:88,jq5i7n0sjs1h0jje,aaa,bbb,,1,0,0,0,1
0,hostServer,,ts08z6vk5nc72fs8,aaac,bbb,snappy,1,0,1,2,3
0,hostServer,,7n7bxc2bm1fyjfab,ab,b,,1,1,1,0,1
12 changes: 7 additions & 5 deletions controllers/index.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,10 +43,10 @@ func (s *IndexController) Host() {
s.display("index/list")
}

func (s *IndexController) GetTaskList() {
func (s *IndexController) GetServerConfig() {
start, length := s.GetAjaxParams()
taskType := s.GetString("type")
list, cnt := lib.CsvDb.GetTaskList(start, length, taskType)
list, cnt := lib.CsvDb.GetServerConfig(start, length, taskType)
s.AjaxTable(list, cnt, cnt)
}

Expand All @@ -56,15 +56,16 @@ func (s *IndexController) Add() {
s.SetInfo("新增")
s.display()
} else {
t := &lib.TaskList{
t := &lib.ServerConfig{
TcpPort: s.GetIntNoErr("port"),
Mode: s.GetString("type"),
Target: s.GetString("target"),
VerifyKey: lib.GetRandomString(16),
U: s.GetString("u"),
P: s.GetString("p"),
Compress: s.GetString("compress"),
Crypt: s.GetString("crypt"),
Crypt: lib.GetBoolByStr(s.GetString("crypt")),
Mux: lib.GetBoolByStr(s.GetString("mux")),
IsRun: 0,
}
lib.CsvDb.NewTask(t)
Expand Down Expand Up @@ -97,7 +98,8 @@ func (s *IndexController) Edit() {
t.U = s.GetString("u")
t.P = s.GetString("p")
t.Compress = s.GetString("compress")
t.Crypt = s.GetString("crypt")
t.Crypt = lib.GetBoolByStr(s.GetString("crypt"))
t.Mux = lib.GetBoolByStr(s.GetString("mux"))
lib.CsvDb.UpdateTask(t)
lib.StopServer(t.VerifyKey)
lib.StartTask(t.VerifyKey)
Expand Down
15 changes: 11 additions & 4 deletions lib/tunnel.go → lib/bridge.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,20 +141,20 @@ retry:
}

//得到一个tcp隧道
func (s *Tunnel) GetTunnel(cFlag string, en, de int, crypt bool) (c *Conn, err error) {
if v, ok := s.tunnelList[cFlag]; !ok || v.Len() < 10 { //新建通道
func (s *Tunnel) GetTunnel(cFlag string, en, de int, crypt, mux bool) (c *Conn, err error) {
if v, ok := s.tunnelList[cFlag]; !ok || v.Len() < 3 { //新建通道
go s.newChan(cFlag)
}
retry:
if err = s.wait(s.tunnelList, cFlag); err != nil {
return
}
c = s.tunnelList[cFlag].Pop()
if _, err := c.wTest(); err != nil {
if _, err = c.wTest(); err != nil {
c.Close()
goto retry
}
c.WriteConnInfo(en, de, crypt)
c.WriteConnInfo(en, de, crypt, mux)
return
}

Expand All @@ -175,6 +175,13 @@ func (s *Tunnel) ReturnSignal(conn *Conn, cFlag string) {
}
}

//重回slice 复用
func (s *Tunnel) ReturnTunnel(conn *Conn, cFlag string) {
if v, ok := s.tunnelList[cFlag]; ok {
v.Add(conn)
}
}

//删除通信通道
func (s *Tunnel) DelClientSignal(cFlag string) {
s.delClient(cFlag, s.signalList)
Expand Down
30 changes: 23 additions & 7 deletions lib/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -102,27 +102,43 @@ func (s *TRPClient) dealChan() error {
c.SetAlive()
//写标志
c.wChan()
re:
//获取连接的host type(tcp or udp)
typeStr, host, en, de, crypt, err := c.GetHostFromConn()
typeStr, host, en, de, crypt, mux, err := c.GetHostFromConn()
if err != nil {
log.Println("get host info error:", err)
return err
}
//与目标建立连接
server, err := net.Dial(typeStr, host)
//与目标建立连接,超时时间为3
server, err := net.DialTimeout(typeStr, host, time.Second*3)
if err != nil {
log.Println("connect to ", host, "error:", err)
log.Println("connect to ", host, "error:", err, mux)
if mux {
s.sendEof(conn, de, crypt)
goto re
}
return err
}
go relay(NewConn(server), c, de, crypt)
relay(c, NewConn(server), en, crypt)
go relay(NewConn(server), c, de, crypt, mux)
relay(c, NewConn(server), en, crypt, mux)
if mux {
goto re
}
return nil
}
func (s *TRPClient) sendEof(c net.Conn, de int, crypt bool) {
switch de {
case COMPRESS_SNAPY_DECODE:
NewSnappyConn(c, crypt).Write([]byte(IO_EOF))
case COMPRESS_NONE_DECODE:
NewCryptConn(c, crypt).Write([]byte(IO_EOF))
}
}

//http模式处理
func (s *TRPClient) dealHttp(c *Conn) error {
buf := make([]byte, 1024*32)
en, de, crypt := c.GetConnInfoFromConn()
en, de, crypt, _ := c.GetConnInfoFromConn()
n, err := c.ReadFrom(buf, de, crypt)
if err != nil {
c.wError()
Expand Down
28 changes: 21 additions & 7 deletions lib/conn.go
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,12 @@ func (s *CryptConn) Write(b []byte) (n int, err error) {

//解密读
func (s *CryptConn) Read(b []byte) (n int, err error) {
defer func() {
if string(b[:n]) == IO_EOF {
err = io.EOF
n = 0
}
}()
if s.crypt {
var lens int
var buf, bs []byte
Expand All @@ -62,7 +68,8 @@ func (s *CryptConn) Read(b []byte) (n int, err error) {
copy(b, bs)
return
}
return s.conn.Read(b)
n, err = s.conn.Read(b)
return
}

type SnappyConn struct {
Expand Down Expand Up @@ -97,6 +104,12 @@ func (s *SnappyConn) Write(b []byte) (n int, err error) {

//snappy压缩读 包含解密
func (s *SnappyConn) Read(b []byte) (n int, err error) {
defer func() {
if string(b[:n]) == IO_EOF {
err = io.EOF
n = 0
}
}()
if n, err = s.r.Read(b); err != nil {
return
}
Expand Down Expand Up @@ -160,14 +173,14 @@ func (s *Conn) ReadFlag() (string, error) {
}

//读取host 连接地址 压缩类型
func (s *Conn) GetHostFromConn() (typeStr string, host string, en, de int, crypt bool, err error) {
func (s *Conn) GetHostFromConn() (typeStr string, host string, en, de int, crypt, mux bool, err error) {
retry:
lType, err := s.ReadLen(3)
if err != nil {
return
}
if typeStr = string(lType); typeStr == TEST_FLAG {
en, de, crypt = s.GetConnInfoFromConn()
en, de, crypt, mux = s.GetConnInfoFromConn()
goto retry
}
cLen, err := s.GetLen()
Expand Down Expand Up @@ -245,20 +258,21 @@ func (s *Conn) WriteTo(b []byte, compress int, crypt bool) (n int, err error) {
}

//写压缩方式,加密
func (s *Conn) WriteConnInfo(en, de int, crypt bool) {
s.Write([]byte(strconv.Itoa(en) + strconv.Itoa(de) + GetStrByBool(crypt)))
func (s *Conn) WriteConnInfo(en, de int, crypt, mux bool) {
s.Write([]byte(strconv.Itoa(en) + strconv.Itoa(de) + GetStrByBool(crypt) + GetStrByBool(mux)))
}

//获取压缩方式,是否加密
func (s *Conn) GetConnInfoFromConn() (en, de int, crypt bool) {
buf, err := s.ReadLen(3)
func (s *Conn) GetConnInfoFromConn() (en, de int, crypt, mux bool) {
buf, err := s.ReadLen(4)
//TODO:错误处理
if err != nil {
return
}
en, _ = strconv.Atoi(string(buf[0]))
de, _ = strconv.Atoi(string(buf[1]))
crypt = GetBoolByStr(string(buf[2]))
mux = GetBoolByStr(string(buf[3]))
return
}

Expand Down
69 changes: 39 additions & 30 deletions lib/file.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,18 +10,21 @@ import (
"strconv"
)

type TaskList struct {
TcpPort int //服务端与客户端通信端口
Mode string //启动方式
Target string //目标
VerifyKey string //flag
U string //socks5验证用户名
P string //socks5验证密码
Compress string //压缩方式
Start int //是否开启
IsRun int //是否在运行
ClientStatus int //客户端状态
Crypt string //是否加密
type ServerConfig struct {
TcpPort int //服务端与客户端通信端口
Mode string //启动方式
Target string //目标
VerifyKey string //flag
U string //socks5验证用户名
P string //socks5验证密码
Compress string //压缩方式
Start int //是否开启
IsRun int //是否在运行
ClientStatus int //客s户端状态
Crypt bool //是否加密
Mux bool //是否加密
CompressEncode int
CompressDecode int
}

type HostList struct {
Expand All @@ -39,7 +42,7 @@ func NewCsv(path string, bridge *Tunnel, runList map[string]interface{}) *Csv {
}

type Csv struct {
Tasks []*TaskList
Tasks []*ServerConfig
Path string
Bridge *Tunnel
RunList map[string]interface{}
Expand Down Expand Up @@ -69,7 +72,10 @@ func (s *Csv) StoreTasksToCsv() {
task.P,
task.Compress,
strconv.Itoa(task.Start),
task.Crypt,
GetStrByBool(task.Crypt),
GetStrByBool(task.Mux),
strconv.Itoa(task.CompressEncode),
strconv.Itoa(task.CompressDecode),
}
err := writer.Write(record)
if err != nil {
Expand Down Expand Up @@ -98,21 +104,24 @@ func (s *Csv) LoadTaskFromCsv() {
if err != nil {
panic(err)
}
var tasks []*TaskList
var tasks []*ServerConfig
// 将每一行数据保存到内存slice中
for _, item := range records {
tcpPort, _ := strconv.Atoi(item[0])
Start, _ := strconv.Atoi(item[7])
post := &TaskList{
TcpPort: tcpPort,
Mode: item[1],
Target: item[2],
VerifyKey: item[3],
U: item[4],
P: item[5],
Compress: item[6],
Start: Start,
Crypt: item[8],
post := &ServerConfig{
TcpPort: tcpPort,
Mode: item[1],
Target: item[2],
VerifyKey: item[3],
U: item[4],
P: item[5],
Compress: item[6],
Start: Start,
Crypt: GetBoolByStr(item[8]),
Mux: GetBoolByStr(item[9]),
CompressEncode: GetIntNoerrByStr(item[10]),
CompressDecode: GetIntNoerrByStr(item[11]),
}
tasks = append(tasks, post)
}
Expand Down Expand Up @@ -177,8 +186,8 @@ func (s *Csv) LoadHostFromCsv() {
s.Hosts = hosts
}

func (s *Csv) GetTaskList(start, length int, typeVal string) ([]*TaskList, int) {
list := make([]*TaskList, 0)
func (s *Csv) GetServerConfig(start, length int, typeVal string) ([]*ServerConfig, int) {
list := make([]*ServerConfig, 0)
var cnt int
for _, v := range s.Tasks {
if v.Mode != typeVal {
Expand Down Expand Up @@ -209,12 +218,12 @@ func (s *Csv) GetTaskList(start, length int, typeVal string) ([]*TaskList, int)
return list, cnt
}

func (s *Csv) NewTask(t *TaskList) {
func (s *Csv) NewTask(t *ServerConfig) {
s.Tasks = append(s.Tasks, t)
s.StoreTasksToCsv()
}

func (s *Csv) UpdateTask(t *TaskList) error {
func (s *Csv) UpdateTask(t *ServerConfig) error {
for k, v := range s.Tasks {
if v.VerifyKey == t.VerifyKey {
s.Tasks = append(s.Tasks[:k], s.Tasks[k+1:]...)
Expand Down Expand Up @@ -246,7 +255,7 @@ func (s *Csv) DelTask(vKey string) error {
return errors.New("不存在")
}

func (s *Csv) GetTask(vKey string) (v *TaskList, err error) {
func (s *Csv) GetTask(vKey string) (v *ServerConfig, err error) {
for _, v = range s.Tasks {
if v.VerifyKey == vKey {
return
Expand Down
Loading

0 comments on commit 9bec536

Please sign in to comment.