72 lines
1.5 KiB
Go
72 lines
1.5 KiB
Go
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))
|
|
}
|
|
}
|