diff --git a/client.go b/client.go index b2e91f4..ab80019 100644 --- a/client.go +++ b/client.go @@ -2,6 +2,7 @@ package pingtunnel import ( "github.com/esrrhs/go-engine/src/loggo" + "github.com/esrrhs/go-engine/src/pool" "github.com/esrrhs/go-engine/src/rbuffergo" "golang.org/x/net/icmp" "math" @@ -33,21 +34,29 @@ func NewClient(addr string, server string, target string, timeout int, sproto in return nil, err } + var sendFramePool *pool.Pool + if tcpmode { + sendFramePool = pool.New(func() interface{} { + return Frame{size: 0, data: make([]byte, FRAME_MAX_SIZE)} + }) + } + r := rand.New(rand.NewSource(time.Now().UnixNano())) return &Client{ - id: r.Intn(math.MaxInt16), - ipaddr: ipaddr, - tcpaddr: tcpaddr, - addr: addr, - ipaddrServer: ipaddrServer, - addrServer: server, - targetAddr: target, - timeout: timeout, - sproto: sproto, - rproto: rproto, - catch: catch, - key: key, - tcpmode: tcpmode, + id: r.Intn(math.MaxInt16), + ipaddr: ipaddr, + tcpaddr: tcpaddr, + addr: addr, + ipaddrServer: ipaddrServer, + addrServer: server, + targetAddr: target, + timeout: timeout, + sproto: sproto, + rproto: rproto, + catch: catch, + key: key, + tcpmode: tcpmode, + sendFramePool: sendFramePool, }, nil } @@ -62,6 +71,8 @@ type Client struct { key int tcpmode bool + sendFramePool *pool.Pool + ipaddr *net.UDPAddr tcpaddr *net.TCPAddr addr string @@ -219,7 +230,7 @@ func (p *Client) AcceptTcpConn(conn *net.TCPConn) error { sendb := rbuffergo.New(1024*1024, false) recvb := rbuffergo.New(1024*1024, false) - cutsize := 800 + cutsize := FRAME_MAX_SIZE sendwin := sendb.Capacity() / cutsize clientConn := &ClientConn{tcpaddr: tcpsrcaddr, id: uuid, activeTime: now, close: false, sendb: sendb, recvb: recvb} diff --git a/pingtunnel.go b/pingtunnel.go index ee14a7f..24c6f93 100644 --- a/pingtunnel.go +++ b/pingtunnel.go @@ -206,8 +206,7 @@ func recvICMP(conn icmp.PacketConn, recv chan<- *Packet) { echoId := int(binary.BigEndian.Uint16(bytes[4:6])) echoSeq := int(binary.BigEndian.Uint16(bytes[6:8])) - my := &MyMsg{ - } + my := &MyMsg{} my.Unmarshal(bytes[8:n]) if (my.TYPE != (uint32)(DATA) && my.TYPE != (uint32)(PING) && my.TYPE != (uint32)(CATCH)) || @@ -262,3 +261,12 @@ type CatchMsg struct { src *net.IPAddr data []byte } + +const ( + FRAME_MAX_SIZE int = 888 +) + +type Frame struct { + size int + data []byte +}