zproxy/proxy/server.go

96 lines
2.2 KiB
Go
Raw Normal View History

2024-02-13 19:45:15 +08:00
package proxy
import (
"net"
2024-02-16 00:07:57 +08:00
"time"
2024-02-13 19:45:15 +08:00
"zproxy/zlog"
)
type UServerProxy struct {
2024-02-15 15:03:33 +08:00
RemoteMap map[uint32]*PacketConnect
2024-02-16 00:07:57 +08:00
LocalMap map[uint32]*PacketConnect
2024-02-15 15:03:33 +08:00
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),
2024-02-16 00:07:57 +08:00
LocalMap: make(map[uint32]*PacketConnect),
2024-02-15 15:03:33 +08:00
MessageQueue: make(chan uint32, 32),
}
2024-02-13 19:45:15 +08:00
}
2024-02-16 00:07:57 +08:00
func (server *UServerProxy) NewTcpConnection(remote *PacketConnect) {
data := remote.ReadHeader()
2024-02-15 15:03:33 +08:00
if string(data[:4]) == "anki" {
id := packetEndian.Uint32(data[4:8])
2024-02-16 00:07:57 +08:00
remote.SetName("remote", id)
2024-02-15 15:03:33 +08:00
if id == RemoteID {
2024-02-16 00:07:57 +08:00
if server.RemoteConn != nil && server.RemoteConn != remote {
2024-02-15 15:03:33 +08:00
_ = server.RemoteConn.Close()
}
2024-02-16 00:07:57 +08:00
zlog.Infof("rcv remote %s => %s", remote.Name(), remote.LocalAddr())
server.RemoteConn = remote
2024-02-15 15:03:33 +08:00
} else {
2024-02-16 00:07:57 +08:00
server.RemoteMap[id] = remote
2024-02-15 15:03:33 +08:00
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-16 00:07:57 +08:00
_ = remote.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-16 00:07:57 +08:00
server.LocalMap[id] = remote
remote.SetName("remote", id)
zlog.Infof("%d %d %s %s", len(server.RemoteMap), len(server.LocalMap), data, remote.Name())
2024-02-15 15:03:33 +08:00
}
func (server *UServerProxy) MessageLoop() {
for {
select {
case mid := <-server.MessageQueue:
remote := server.RemoteMap[mid]
2024-02-16 00:07:57 +08:00
local := server.LocalMap[mid]
if local == nil || remote == nil {
2024-02-15 15:03:33 +08:00
continue
}
go func() {
2024-02-16 00:07:57 +08:00
local.Forward(remote, HeaderSize)
delete(server.LocalMap, mid)
2024-02-15 15:03:33 +08:00
}()
go func() {
2024-02-16 00:07:57 +08:00
remote.Forward(local, 0)
local.SetReadDeadline(time.Now())
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
}
}