zproxy/proxy/client.go

52 lines
1.1 KiB
Go
Raw Normal View History

2024-02-13 19:45:15 +08:00
package proxy
import (
"net"
"zproxy/zlog"
)
type UClientProxy struct {
ServerConn *UPacketConnection
}
func NewClientProxy() *UClientProxy {
return &UClientProxy{}
}
func (client *UClientProxy) ServeTCP(serverAddr string, clientAddr string) error {
conn, err := net.Dial("tcp", serverAddr)
if err != nil {
return err
}
zlog.Infof("connect server %s", serverAddr)
client.ServerConn = NewPacketConnection(conn)
_, err = client.ServerConn.Write([]byte("anki"))
if err != nil {
return err
}
for {
data := make([]byte, 4)
_, err := client.ServerConn.Read(data, 0, 4)
if err != nil {
return err
}
if string(data) != "anki" {
zlog.Error("rcv package error:", data)
client.ServerConn.Clear()
continue
}
conn, err := net.Dial("tcp", clientAddr)
if err != nil {
zlog.Error("connect local anki error: ", err.Error(), clientAddr)
client.ServerConn.ForwardError(err)
continue
}
pc := NewPacketConnection(conn)
client.ServerConn.Forward(pc)
pc.Forward(client.ServerConn)
err = pc.Close()
if err != nil {
zlog.Error("close local anki error: ", err.Error())
}
}
}