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])
|
2024-02-15 23:48:07 +08:00
|
|
|
client.SetName("remote", id)
|
2024-02-15 15:03:33 +08:00
|
|
|
if id == RemoteID {
|
|
|
|
|
if server.RemoteConn != nil && server.RemoteConn != client {
|
|
|
|
|
_ = server.RemoteConn.Close()
|
|
|
|
|
}
|
2024-02-15 23:48:07 +08:00
|
|
|
zlog.Infof("rcv remote %s => %s", client.Name(), client.LocalAddr())
|
2024-02-15 15:03:33 +08:00
|
|
|
server.RemoteConn = client
|
|
|
|
|
} 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-15 23:48:07 +08:00
|
|
|
_ = client.Close()
|
2024-02-13 19:45:15 +08:00
|
|
|
return
|
|
|
|
|
}
|
2024-02-15 15:03:33 +08:00
|
|
|
id := IncID()
|
|
|
|
|
server.RemoteConn.WriteHeader(id)
|
2024-02-15 23:48:07 +08:00
|
|
|
if server.RemoteConn.writeErr != nil {
|
|
|
|
|
zlog.Infof("remote disconnect %s", server.RemoteConn.RemoteAddr())
|
|
|
|
|
_ = server.RemoteConn.Close()
|
|
|
|
|
server.RemoteConn = nil
|
|
|
|
|
return
|
|
|
|
|
}
|
2024-02-15 15:03:33 +08:00
|
|
|
server.ClientMap[id] = client
|
2024-02-15 23:48:07 +08:00
|
|
|
client.SetName("local", id)
|
|
|
|
|
zlog.Infof("%d %d %s %s", len(server.RemoteMap), len(server.ClientMap), data, client.Name())
|
2024-02-15 15:03:33 +08:00
|
|
|
}
|
|
|
|
|
func (server *UServerProxy) MessageLoop() {
|
|
|
|
|
for {
|
|
|
|
|
select {
|
|
|
|
|
case mid := <-server.MessageQueue:
|
|
|
|
|
remote := server.RemoteMap[mid]
|
|
|
|
|
client := server.ClientMap[mid]
|
|
|
|
|
if client == nil || remote == nil {
|
|
|
|
|
continue
|
|
|
|
|
}
|
|
|
|
|
go func() {
|
|
|
|
|
client.Forward(remote, HeaderSize)
|
2024-02-15 23:48:07 +08:00
|
|
|
delete(server.ClientMap, mid)
|
2024-02-15 15:03:33 +08:00
|
|
|
}()
|
|
|
|
|
go func() {
|
|
|
|
|
remote.Forward(client, 0)
|
2024-02-15 23:48:07 +08:00
|
|
|
delete(server.RemoteMap, mid)
|
2024-02-15 15:03:33 +08:00
|
|
|
}()
|
|
|
|
|
}
|
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) {
|
2024-02-15 23:48:07 +08:00
|
|
|
_ = ln.Close()
|
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 23:48:07 +08:00
|
|
|
go server.NewTcpConnection(NewPacketConnect(conn, "client", 0))
|
2024-02-13 19:45:15 +08:00
|
|
|
}
|
|
|
|
|
}
|