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()) } } }