package proxy import ( "net" "time" "zproxy/zlog" ) type UClientProxy struct { serverAddr string clientAddr string } func (client *UClientProxy) NewClientConnection(id uint32) *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", id) } func (client *UClientProxy) NewTcpConnection(id uint32) *PacketConnect { conn, err := net.Dial("tcp", client.serverAddr) if err != nil { zlog.Fatalf("connect server error: %d", id) return nil } remote := NewPacketConnect(conn, "remote", id) remote.WriteHeader(id) if id == RemoteID { return remote } local := client.NewClientConnection(id) if local == nil { err = remote.Close() return nil } zlog.Infof("Forward %s => %s", remote.LocalAddr(), remote.Name()) go func() { local.Forward(remote, 0) remote.SetReadDeadline(time.Now()) }() 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:8]) go client.NewTcpConnection(id) } }