mirror of
https://github.com/cmz0228/hysteria-dev.git
synced 2025-07-25 23:28:33 +00:00
feat: port forwarding
This commit is contained in:
62
app/internal/forwarding/tcp.go
Normal file
62
app/internal/forwarding/tcp.go
Normal file
@@ -0,0 +1,62 @@
|
||||
package forwarding
|
||||
|
||||
import (
|
||||
"io"
|
||||
"net"
|
||||
|
||||
"github.com/apernet/hysteria/core/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.DialTCP(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
|
||||
}
|
Reference in New Issue
Block a user