mirror of
https://github.com/cmz0228/hysteria-dev.git
synced 2025-08-13 04:41:47 +00:00
.github
app
cmd
internal
forwarding
tcp.go
tcp_test.go
udp.go
udp_test.go
http
proxymux
redirect
sockopts
socks5
tproxy
tun
url
utils
utils_test
misc
go.mod
go.sum
main.go
pprof.go
core
extras
media-kit
scripts
.gitignore
CHANGELOG.md
Dockerfile
LICENSE.md
PROTOCOL.md
README.md
go.work
go.work.sum
hyperbole.py
logo.svg
platforms.txt
63 lines
1.0 KiB
Go
63 lines
1.0 KiB
Go
package forwarding
|
|
|
|
import (
|
|
"io"
|
|
"net"
|
|
|
|
"github.com/apernet/hysteria/core/v2/client"
|
|
)
|
|
|
|
type TCPTunnel struct {
|
|
HyClient client.Client
|
|
Remote string
|
|
EventLogger TCPEventLogger
|
|
}
|
|
|
|
type TCPEventLogger interface {
|
|
Connect(addr net.Addr)
|
|
Error(addr net.Addr, err error)
|
|
}
|
|
|
|
func (t *TCPTunnel) Serve(listener net.Listener) error {
|
|
for {
|
|
conn, err := listener.Accept()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
go t.handle(conn)
|
|
}
|
|
}
|
|
|
|
func (t *TCPTunnel) handle(conn net.Conn) {
|
|
defer conn.Close()
|
|
|
|
if t.EventLogger != nil {
|
|
t.EventLogger.Connect(conn.RemoteAddr())
|
|
}
|
|
var closeErr error
|
|
defer func() {
|
|
if t.EventLogger != nil {
|
|
t.EventLogger.Error(conn.RemoteAddr(), closeErr)
|
|
}
|
|
}()
|
|
|
|
rc, err := t.HyClient.TCP(t.Remote)
|
|
if err != nil {
|
|
closeErr = err
|
|
return
|
|
}
|
|
defer rc.Close()
|
|
|
|
// Start forwarding
|
|
copyErrChan := make(chan error, 2)
|
|
go func() {
|
|
_, copyErr := io.Copy(rc, conn)
|
|
copyErrChan <- copyErr
|
|
}()
|
|
go func() {
|
|
_, copyErr := io.Copy(conn, rc)
|
|
copyErrChan <- copyErr
|
|
}()
|
|
closeErr = <-copyErrChan
|
|
}
|