zproxy/proxy/client.go
2024-02-15 15:03:33 +08:00

55 lines
1.3 KiB
Go

package proxy
import (
"net"
"zproxy/zlog"
)
type UClientProxy struct {
serverAddr string
clientAddr string
}
func (client *UClientProxy) NewClientConnection() *PacketConnect {
conn, err := net.Dial("tcp", client.clientAddr)
if err != nil {
zlog.Infof("connect local client error: %s %s", err.Error(), client.clientAddr)
return nil
}
return NewPacketConnect(conn, "local")
}
func (client *UClientProxy) NewTcpConnection(id uint32) *PacketConnect {
conn, err := net.Dial("tcp", client.serverAddr)
if err != nil {
zlog.Infof("connect server error: %s", err.Error())
}
remote := NewPacketConnect(conn, "remote")
remote.WriteHeader(id)
if id == RemoteID {
return remote
}
local := client.NewClientConnection()
if local == nil {
err = remote.Close()
return nil
}
go local.Forward(remote, 0)
go remote.Forward(local, 0)
return nil
}
func (client *UClientProxy) ServeTCP(serverAddr string, clientAddr string) error {
client.serverAddr = serverAddr
client.clientAddr = clientAddr
RemoteConn := client.NewTcpConnection(RemoteID)
zlog.Infof("connect to server %s", RemoteConn.Name())
for {
data := RemoteConn.ReadHeader()
if string(data[:4]) != "anki" {
zlog.Error("rcv package error:", data)
continue
}
id := packetEndian.Uint32(data[4:])
go client.NewTcpConnection(id)
}
}