package proxy import ( "net" "zproxy/zlog" ) type UServerProxy struct { AnkiConn *UPacketConnection } func NewServerProxy() *UServerProxy { return &UServerProxy{} } func (server *UServerProxy) NewTcpConnection(client *UPacketConnection) { defer func() { if client == server.AnkiConn { return } err := client.Close() if err != nil { zlog.Error("close client error: ", err) } }() data := []byte("anki0000") _, err := client.Read(data, 4, 8) if err != nil { zlog.Error("read client error: ", client.Conn.RemoteAddr(), err.Error()) return } zlog.Infof("new client %s %s", client.Conn.RemoteAddr(), data[4:]) if string(data[4:]) == "anki" { server.AnkiConn = client return } if server.AnkiConn == nil { client.ForwardError(ErrNoAnkiProxy) return } _, err = server.AnkiConn.Write(data) if err != nil { return } client.Forward(server.AnkiConn) server.AnkiConn.Forward(client) } func (server *UServerProxy) ServeTCP(listenAddr string) error { // listenAddr 只能填端口号 ln, err := net.Listen("tcp", listenAddr) if err != nil { zlog.Error("listen server error: ", err.Error(), listenAddr) return err } zlog.Infof("listen server %s", listenAddr) defer func(ln net.Listener) { err := ln.Close() if err != nil { zlog.Error("close listen server error: ", err.Error(), listenAddr) } }(ln) for { conn, err := ln.Accept() if err != nil { if IsTimeoutError(err) { continue } return err } go server.NewTcpConnection(NewPacketConnection(conn)) } }