mirror of https://github.com/Dreamacro/clash.git
31 lines
743 B
Go
31 lines
743 B
Go
package net
|
|
|
|
import (
|
|
"io"
|
|
"net"
|
|
"time"
|
|
|
|
"github.com/Dreamacro/clash/common/pool"
|
|
)
|
|
|
|
// Relay copies between left and right bidirectionally.
|
|
func Relay(leftConn, rightConn net.Conn) {
|
|
ch := make(chan error)
|
|
|
|
go func() {
|
|
buf := pool.Get(pool.RelayBufferSize)
|
|
// Wrapping to avoid using *net.TCPConn.(ReadFrom)
|
|
// See also https://github.com/Dreamacro/clash/pull/1209
|
|
_, err := io.CopyBuffer(WriteOnlyWriter{Writer: leftConn}, ReadOnlyReader{Reader: rightConn}, buf)
|
|
pool.Put(buf)
|
|
leftConn.SetReadDeadline(time.Now())
|
|
ch <- err
|
|
}()
|
|
|
|
buf := pool.Get(pool.RelayBufferSize)
|
|
io.CopyBuffer(WriteOnlyWriter{Writer: rightConn}, ReadOnlyReader{Reader: leftConn}, buf)
|
|
pool.Put(buf)
|
|
rightConn.SetReadDeadline(time.Now())
|
|
<-ch
|
|
}
|