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