zproxy/proxy/server.go

91 lines
2.0 KiB
Go
Raw Normal View History

2024-02-13 19:45:15 +08:00
package proxy
import (
"net"
"zproxy/zlog"
)
type UServerProxy struct {
2024-02-15 15:03:33 +08:00
RemoteMap map[uint32]*PacketConnect
ClientMap map[uint32]*PacketConnect
RemoteConn *PacketConnect
MessageQueue chan uint32
2024-02-13 19:45:15 +08:00
}
func NewServerProxy() *UServerProxy {
2024-02-15 15:03:33 +08:00
return &UServerProxy{
RemoteMap: make(map[uint32]*PacketConnect),
ClientMap: make(map[uint32]*PacketConnect),
MessageQueue: make(chan uint32, 32),
}
2024-02-13 19:45:15 +08:00
}
2024-02-15 15:03:33 +08:00
func (server *UServerProxy) NewTcpConnection(client *PacketConnect) {
data := client.ReadHeader()
if string(data[:4]) == "anki" {
id := packetEndian.Uint32(data[4:8])
client.SetRemote("remote", id)
if id == RemoteID {
if server.RemoteConn != nil && server.RemoteConn != client {
_ = server.RemoteConn.Close()
}
server.RemoteConn = client
zlog.Infof("rcv %d %s", id, client.Name())
} else {
server.RemoteMap[id] = client
server.MessageQueue <- id
2024-02-13 19:45:15 +08:00
}
return
}
2024-02-15 15:03:33 +08:00
if server.RemoteConn == nil {
2024-02-13 19:45:15 +08:00
return
}
2024-02-15 15:03:33 +08:00
id := IncID()
server.RemoteConn.WriteHeader(id)
server.ClientMap[id] = client
zlog.Infof("%d %s", id, data)
}
func (server *UServerProxy) MessageLoop() {
for {
select {
case mid := <-server.MessageQueue:
remote := server.RemoteMap[mid]
client := server.ClientMap[mid]
if client == nil || remote == nil {
server.RemoteMap[mid] = nil
server.ClientMap[mid] = nil
continue
}
go func() {
client.Forward(remote, HeaderSize)
server.ClientMap[mid] = nil
}()
go func() {
remote.Forward(client, 0)
server.RemoteMap[mid] = nil
}()
}
2024-02-13 19:45:15 +08:00
}
}
func (server *UServerProxy) ServeTCP(listenAddr string) error {
// listenAddr 只能填端口号
ln, err := net.Listen("tcp", listenAddr)
if err != nil {
2024-02-15 15:03:33 +08:00
zlog.Error("listen error:", err.Error())
2024-02-13 19:45:15 +08:00
}
2024-02-15 15:03:33 +08:00
zlog.Infof("listen %s", ln.Addr())
2024-02-13 19:45:15 +08:00
defer func(ln net.Listener) {
err := ln.Close()
if err != nil {
2024-02-15 15:03:33 +08:00
zlog.Error("close client error: ", err.Error())
2024-02-13 19:45:15 +08:00
}
}(ln)
2024-02-15 15:03:33 +08:00
go server.MessageLoop()
2024-02-13 19:45:15 +08:00
for {
conn, err := ln.Accept()
if err != nil {
return err
}
2024-02-15 15:03:33 +08:00
server.NewTcpConnection(NewPacketConnect(conn, "client"))
2024-02-13 19:45:15 +08:00
}
}