zproxy/proxy/server.go

72 lines
1.5 KiB
Go
Raw Normal View History

2024-02-13 19:45:15 +08:00
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))
}
}