Commit d8af58ce authored by ginuerzh's avatar ginuerzh

reduce buffer allocation

parent b2d5319d
...@@ -284,7 +284,7 @@ func (c *relayConn) Read(b []byte) (n int, err error) { ...@@ -284,7 +284,7 @@ func (c *relayConn) Read(b []byte) (n int, err error) {
}) })
if err != nil { if err != nil {
log.Log("[relay] %s <- %s: %s", c.Conn.LocalAddr(), c.Conn.RemoteAddr(), err) log.Logf("[relay] %s <- %s: %s", c.Conn.LocalAddr(), c.Conn.RemoteAddr(), err)
return return
} }
...@@ -334,7 +334,13 @@ func (c *relayConn) Write(b []byte) (n int, err error) { ...@@ -334,7 +334,13 @@ func (c *relayConn) Write(b []byte) (n int, err error) {
if !c.udp { if !c.udp {
return c.Conn.Write(b) return c.Conn.Write(b)
} }
buf := make([]byte, 2+len(b)) var buf []byte
if 2+len(b) <= mediumBufferSize {
buf = mPool.Get().([]byte)
defer mPool.Put(buf)
} else {
buf = make([]byte, 2+len(b))
}
binary.BigEndian.PutUint16(buf[:2], uint16(len(b))) binary.BigEndian.PutUint16(buf[:2], uint16(len(b)))
n = copy(buf[2:], b) n = copy(buf[2:], b)
_, err = c.Conn.Write(buf) _, err = c.Conn.Write(buf)
......
...@@ -563,7 +563,13 @@ func (h *tapHandler) Handle(conn net.Conn) { ...@@ -563,7 +563,13 @@ func (h *tapHandler) Handle(conn net.Conn) {
if err != nil { if err != nil {
return err return err
} }
pc = cc.(net.PacketConn) var ok bool
pc, ok = cc.(net.PacketConn)
if !ok {
err = errors.New("not a packet connection")
log.Logf("[tap] %s - %s: %s", conn.LocalAddr(), raddr, err)
return err
}
} else { } else {
if h.options.TCPMode { if h.options.TCPMode {
if raddr != nil { if raddr != nil {
......
...@@ -89,7 +89,9 @@ func UDPListener(addr string, cfg *UDPListenConfig) (Listener, error) { ...@@ -89,7 +89,9 @@ func UDPListener(addr string, cfg *UDPListenConfig) (Listener, error) {
func (l *udpListener) listenLoop() { func (l *udpListener) listenLoop() {
for { for {
b := make([]byte, mediumBufferSize) // NOTE: this buffer will be released in the udpServerConn after read.
b := mPool.Get().([]byte)
n, raddr, err := l.ln.ReadFrom(b) n, raddr, err := l.ln.ReadFrom(b)
if err != nil { if err != nil {
log.Logf("[udp] peer -> %s : %s", l.Addr(), err) log.Logf("[udp] peer -> %s : %s", l.Addr(), err)
...@@ -240,6 +242,9 @@ func (c *udpServerConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) { ...@@ -240,6 +242,9 @@ func (c *udpServerConn) ReadFrom(b []byte) (n int, addr net.Addr, err error) {
select { select {
case bb := <-c.rChan: case bb := <-c.rChan:
n = copy(b, bb) n = copy(b, bb)
if cap(bb) == mediumBufferSize {
mPool.Put(bb[:cap(bb)])
}
case <-c.closed: case <-c.closed:
err = errors.New("read from closed connection") err = errors.New("read from closed connection")
return return
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment