Udp 多路复用 优化

This commit is contained in:
刘河 2019-01-08 00:21:02 +08:00
parent 7d8b1d02e1
commit 05e66af647
6 changed files with 43 additions and 25 deletions

View File

@ -35,7 +35,7 @@ type Tunnel struct {
signalList map[string]*list //通信 signalList map[string]*list //通信
tunnelList map[string]*list //隧道 tunnelList map[string]*list //隧道
lock sync.Mutex lock sync.Mutex
tunnelLock sync.Mutex tunnelLock sync.Mutex
} }
func newTunnel(tunnelPort int) *Tunnel { func newTunnel(tunnelPort int) *Tunnel {
@ -181,6 +181,7 @@ func (s *Tunnel) ReturnSignal(conn *Conn, cFlag string) {
//重回slice 复用 //重回slice 复用
func (s *Tunnel) ReturnTunnel(conn *Conn, cFlag string) { func (s *Tunnel) ReturnTunnel(conn *Conn, cFlag string) {
if v, ok := s.tunnelList[cFlag]; ok { if v, ok := s.tunnelList[cFlag]; ok {
FlushConn(conn.conn)
v.Add(conn) v.Add(conn)
} }
} }

View File

@ -123,6 +123,7 @@ re:
relay(c.conn, server, en, crypt, mux) relay(c.conn, server, en, crypt, mux)
end: end:
if mux { if mux {
FlushConn(conn)
goto re goto re
} else { } else {
c.Close() c.Close()

View File

@ -6,6 +6,7 @@ import (
"crypto/cipher" "crypto/cipher"
"crypto/md5" "crypto/md5"
"encoding/hex" "encoding/hex"
"github.com/pkg/errors"
"math/rand" "math/rand"
"time" "time"
) )
@ -38,9 +39,9 @@ func AesDecrypt(crypted, key []byte) ([]byte, error) {
origData := make([]byte, len(crypted)) origData := make([]byte, len(crypted))
// origData := crypted // origData := crypted
blockMode.CryptBlocks(origData, crypted) blockMode.CryptBlocks(origData, crypted)
origData = PKCS5UnPadding(origData) err, origData = PKCS5UnPadding(origData)
// origData = ZeroUnPadding(origData) // origData = ZeroUnPadding(origData)
return origData, nil return origData, err
} }
//补全 //补全
@ -51,11 +52,14 @@ func PKCS5Padding(ciphertext []byte, blockSize int) []byte {
} }
//去补 //去补
func PKCS5UnPadding(origData []byte) []byte { func PKCS5UnPadding(origData []byte) (error, []byte) {
length := len(origData) length := len(origData)
// 去掉最后一个字节 unpadding 次 // 去掉最后一个字节 unpadding 次
unpadding := int(origData[length-1]) unpadding := int(origData[length-1])
return origData[:(length - unpadding)] if (length - unpadding) < 0 {
return errors.New("len error"), nil
}
return nil, origData[:(length - unpadding)]
} }
//生成32位md5字串 //生成32位md5字串

View File

@ -190,6 +190,8 @@ func (s *TunnelModeServer) dealClient(c *Conn, cnf *ServerConfig, addr string, m
defer func() { defer func() {
if cnf.Mux { if cnf.Mux {
s.bridge.ReturnTunnel(link, getverifyval(cnf.VerifyKey)) s.bridge.ReturnTunnel(link, getverifyval(cnf.VerifyKey))
} else {
c.Close()
} }
}() }()
if err != nil { if err != nil {
@ -212,8 +214,6 @@ func (s *TunnelModeServer) dealClient(c *Conn, cnf *ServerConfig, addr string, m
} }
go relay(link.conn, c.conn, cnf.CompressEncode, cnf.Crypt, cnf.Mux) go relay(link.conn, c.conn, cnf.CompressEncode, cnf.Crypt, cnf.Mux)
relay(c.conn, link.conn, cnf.CompressDecode, cnf.Crypt, cnf.Mux) relay(c.conn, link.conn, cnf.CompressDecode, cnf.Crypt, cnf.Mux)
} else {
c.Close()
} }
} }
return nil return nil

View File

@ -5,7 +5,6 @@ import (
"log" "log"
"net" "net"
"strings" "strings"
"time"
) )
type UdpModeServer struct { type UdpModeServer struct {
@ -54,25 +53,25 @@ func (s *UdpModeServer) process(addr *net.UDPAddr, data []byte) {
conn.Close() conn.Close()
return return
} }
conn.WriteTo(data, s.config.CompressEncode, s.config.Crypt)
if flag, err := conn.ReadFlag(); err == nil { if flag, err := conn.ReadFlag(); err == nil {
if flag == CONN_SUCCESS { defer func() {
go func(addr *net.UDPAddr, conn *Conn) { if s.config.Mux {
defer func() { s.bridge.ReturnTunnel(conn, getverifyval(s.config.VerifyKey))
if s.config.Mux { } else {
s.bridge.ReturnTunnel(conn, getverifyval(s.config.VerifyKey))
}
}()
buf := make([]byte, 1024)
conn.conn.SetReadDeadline(time.Now().Add(time.Duration(time.Second * 3)))
n, err := conn.ReadFrom(buf, s.config.CompressDecode, s.config.Crypt)
if err != nil || err == io.EOF {
conn.Close()
return
}
s.listener.WriteToUDP(buf[:n], addr)
conn.Close() conn.Close()
}(addr, conn) }
}()
if flag == CONN_SUCCESS {
conn.WriteTo(data, s.config.CompressEncode, s.config.Crypt)
buf := make([]byte, 1024)
//conn.conn.SetReadDeadline(time.Now().Add(time.Duration(time.Second * 3)))
n, err := conn.ReadFrom(buf, s.config.CompressDecode, s.config.Crypt)
if err != nil || err == io.EOF {
log.Println("revieve error:", err)
return
}
s.listener.WriteToUDP(buf[:n], addr)
conn.WriteTo([]byte(IO_EOF), s.config.CompressEncode, s.config.Crypt)
} }
} }
} }

View File

@ -17,6 +17,7 @@ import (
"strconv" "strconv"
"strings" "strings"
"sync" "sync"
"time"
) )
var ( var (
@ -315,3 +316,15 @@ func copyBuffer(dst io.Writer, src io.Reader) (written int64, err error) {
} }
return written, err return written, err
} }
//连接重置 清空缓存区
func FlushConn(c net.Conn) {
c.SetReadDeadline(time.Now().Add(time.Second * 3))
buf := bufPool.Get().([]byte)
for {
if _, err := c.Read(buf); err != nil {
break
}
}
c.SetReadDeadline(time.Time{})
}