update
This commit is contained in:
parent
b0007f4cfd
commit
48c1dfc8c5
BIN
client.exe
BIN
client.exe
Binary file not shown.
@ -10,30 +10,35 @@ type UClientProxy struct {
|
|||||||
clientAddr string
|
clientAddr string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (client *UClientProxy) NewClientConnection() *PacketConnect {
|
func (client *UClientProxy) NewClientConnection(id uint32) *PacketConnect {
|
||||||
conn, err := net.Dial("tcp", client.clientAddr)
|
conn, err := net.Dial("tcp", client.clientAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
zlog.Infof("connect local client error: %s %s", err.Error(), client.clientAddr)
|
zlog.Infof("connect local client error: %s %s", err.Error(), client.clientAddr)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
return NewPacketConnect(conn, "local")
|
return NewPacketConnect(conn, "local", id)
|
||||||
}
|
}
|
||||||
func (client *UClientProxy) NewTcpConnection(id uint32) *PacketConnect {
|
func (client *UClientProxy) NewTcpConnection(id uint32) *PacketConnect {
|
||||||
conn, err := net.Dial("tcp", client.serverAddr)
|
conn, err := net.Dial("tcp", client.serverAddr)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
zlog.Infof("connect server error: %s", err.Error())
|
zlog.Fatalf("connect server error: %d", id)
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
remote := NewPacketConnect(conn, "remote")
|
remote := NewPacketConnect(conn, "remote", id)
|
||||||
remote.WriteHeader(id)
|
remote.WriteHeader(id)
|
||||||
if id == RemoteID {
|
if id == RemoteID {
|
||||||
return remote
|
return remote
|
||||||
}
|
}
|
||||||
local := client.NewClientConnection()
|
local := client.NewClientConnection(id)
|
||||||
if local == nil {
|
if local == nil {
|
||||||
err = remote.Close()
|
err = remote.Close()
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
go local.Forward(remote, 0)
|
zlog.Infof("Forward %s => %s", remote.LocalAddr(), remote.Name())
|
||||||
|
go func() {
|
||||||
|
local.Forward(remote, 0)
|
||||||
|
//remote.SetReadDeadline(time.Now())
|
||||||
|
}()
|
||||||
go remote.Forward(local, 0)
|
go remote.Forward(local, 0)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -48,7 +53,7 @@ func (client *UClientProxy) ServeTCP(serverAddr string, clientAddr string) error
|
|||||||
zlog.Error("rcv package error:", data)
|
zlog.Error("rcv package error:", data)
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
id := packetEndian.Uint32(data[4:])
|
id := packetEndian.Uint32(data[4:8])
|
||||||
go client.NewTcpConnection(id)
|
go client.NewTcpConnection(id)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,34 +1,12 @@
|
|||||||
package proxy
|
package proxy
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/binary"
|
|
||||||
"net"
|
"net"
|
||||||
"strconv"
|
"strconv"
|
||||||
"time"
|
"time"
|
||||||
|
"zproxy/zlog"
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
|
||||||
packetEndian = binary.LittleEndian
|
|
||||||
RemoteID uint32 = 1
|
|
||||||
sid = RemoteID
|
|
||||||
maxSid uint32 = 1024 * 1024
|
|
||||||
HeaderSize = 16
|
|
||||||
Magic = "anki"
|
|
||||||
InitBuf = func() []byte {
|
|
||||||
buf := make([]byte, HeaderSize)
|
|
||||||
copy(buf[:len(Magic)], Magic)
|
|
||||||
return buf
|
|
||||||
}()
|
|
||||||
)
|
|
||||||
|
|
||||||
func IncID() uint32 {
|
|
||||||
if sid > maxSid {
|
|
||||||
sid = RemoteID
|
|
||||||
}
|
|
||||||
sid++
|
|
||||||
return sid
|
|
||||||
}
|
|
||||||
|
|
||||||
type PacketConnect struct {
|
type PacketConnect struct {
|
||||||
net.Conn
|
net.Conn
|
||||||
header []byte
|
header []byte
|
||||||
@ -38,16 +16,16 @@ type PacketConnect struct {
|
|||||||
name string
|
name string
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewPacketConnect(conn net.Conn, name string) *PacketConnect {
|
func NewPacketConnect(conn net.Conn, name string, id uint32) *PacketConnect {
|
||||||
pc := &PacketConnect{Conn: conn, header: make([]byte, HeaderSize)}
|
pc := &PacketConnect{Conn: conn, header: make([]byte, HeaderSize)}
|
||||||
pc.SetRemote(name, 0)
|
pc.SetName(name, id)
|
||||||
copy(pc.header, InitBuf)
|
copy(pc.header, InitBuf)
|
||||||
return pc
|
return pc
|
||||||
}
|
}
|
||||||
func (pc *PacketConnect) Name() string {
|
func (pc *PacketConnect) Name() string {
|
||||||
return pc.name
|
return pc.name
|
||||||
}
|
}
|
||||||
func (pc *PacketConnect) SetRemote(name string, id uint32) {
|
func (pc *PacketConnect) SetName(name string, id uint32) {
|
||||||
pc.id = id
|
pc.id = id
|
||||||
pc.name = "(" + name + ")" + strconv.Itoa(int(id)) + "::" + pc.RemoteAddr().String()
|
pc.name = "(" + name + ")" + strconv.Itoa(int(id)) + "::" + pc.RemoteAddr().String()
|
||||||
}
|
}
|
||||||
@ -62,6 +40,12 @@ func (pc *PacketConnect) Read(data []byte) int {
|
|||||||
pc.readErr = err
|
pc.readErr = err
|
||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
func (pc *PacketConnect) SetReadDeadline(t time.Time) {
|
||||||
|
err := pc.Conn.SetReadDeadline(t)
|
||||||
|
if err != nil {
|
||||||
|
pc.readErr = err
|
||||||
|
}
|
||||||
|
}
|
||||||
func (pc *PacketConnect) ReadHeader() []byte {
|
func (pc *PacketConnect) ReadHeader() []byte {
|
||||||
pc.Read(pc.header)
|
pc.Read(pc.header)
|
||||||
return pc.header
|
return pc.header
|
||||||
@ -76,12 +60,17 @@ func (pc *PacketConnect) Forward(dst *PacketConnect, rn int) {
|
|||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
_ = pc.Close()
|
_ = pc.Close()
|
||||||
|
if Level > 0 {
|
||||||
|
zlog.Infof("forward %d %s %s => %s %s || %s", rn, pc.LocalAddr(), pc.Name(), dst.Name(), pc.readErr, dst.writeErr)
|
||||||
|
}
|
||||||
}()
|
}()
|
||||||
data := make([]byte, 1024)
|
data := make([]byte, MTU)
|
||||||
for pc.readErr == nil && dst.writeErr == nil {
|
for pc.readErr == nil && dst.writeErr == nil {
|
||||||
_ = pc.SetReadDeadline(time.Now().Add(time.Second))
|
|
||||||
n := pc.Read(data)
|
n := pc.Read(data)
|
||||||
|
n = dst.Write(data[:n])
|
||||||
rn += n
|
rn += n
|
||||||
dst.Write(data[:n])
|
if Level > 1 {
|
||||||
|
zlog.Infof("rw %d %s => %s %s || %s", n, pc.Name(), dst.Name(), pc.readErr, dst.writeErr)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -23,13 +23,13 @@ func (server *UServerProxy) NewTcpConnection(client *PacketConnect) {
|
|||||||
data := client.ReadHeader()
|
data := client.ReadHeader()
|
||||||
if string(data[:4]) == "anki" {
|
if string(data[:4]) == "anki" {
|
||||||
id := packetEndian.Uint32(data[4:8])
|
id := packetEndian.Uint32(data[4:8])
|
||||||
client.SetRemote("remote", id)
|
client.SetName("remote", id)
|
||||||
if id == RemoteID {
|
if id == RemoteID {
|
||||||
if server.RemoteConn != nil && server.RemoteConn != client {
|
if server.RemoteConn != nil && server.RemoteConn != client {
|
||||||
_ = server.RemoteConn.Close()
|
_ = server.RemoteConn.Close()
|
||||||
}
|
}
|
||||||
|
zlog.Infof("rcv remote %s => %s", client.Name(), client.LocalAddr())
|
||||||
server.RemoteConn = client
|
server.RemoteConn = client
|
||||||
zlog.Infof("rcv %d %s", id, client.Name())
|
|
||||||
} else {
|
} else {
|
||||||
server.RemoteMap[id] = client
|
server.RemoteMap[id] = client
|
||||||
server.MessageQueue <- id
|
server.MessageQueue <- id
|
||||||
@ -37,12 +37,20 @@ func (server *UServerProxy) NewTcpConnection(client *PacketConnect) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
if server.RemoteConn == nil {
|
if server.RemoteConn == nil {
|
||||||
|
_ = client.Close()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
id := IncID()
|
id := IncID()
|
||||||
server.RemoteConn.WriteHeader(id)
|
server.RemoteConn.WriteHeader(id)
|
||||||
|
if server.RemoteConn.writeErr != nil {
|
||||||
|
zlog.Infof("remote disconnect %s", server.RemoteConn.RemoteAddr())
|
||||||
|
_ = server.RemoteConn.Close()
|
||||||
|
server.RemoteConn = nil
|
||||||
|
return
|
||||||
|
}
|
||||||
server.ClientMap[id] = client
|
server.ClientMap[id] = client
|
||||||
zlog.Infof("%d %s", id, data)
|
client.SetName("local", id)
|
||||||
|
zlog.Infof("%d %d %s %s", len(server.RemoteMap), len(server.ClientMap), data, client.Name())
|
||||||
}
|
}
|
||||||
func (server *UServerProxy) MessageLoop() {
|
func (server *UServerProxy) MessageLoop() {
|
||||||
for {
|
for {
|
||||||
@ -51,17 +59,15 @@ func (server *UServerProxy) MessageLoop() {
|
|||||||
remote := server.RemoteMap[mid]
|
remote := server.RemoteMap[mid]
|
||||||
client := server.ClientMap[mid]
|
client := server.ClientMap[mid]
|
||||||
if client == nil || remote == nil {
|
if client == nil || remote == nil {
|
||||||
server.RemoteMap[mid] = nil
|
|
||||||
server.ClientMap[mid] = nil
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
go func() {
|
go func() {
|
||||||
client.Forward(remote, HeaderSize)
|
client.Forward(remote, HeaderSize)
|
||||||
server.ClientMap[mid] = nil
|
delete(server.ClientMap, mid)
|
||||||
}()
|
}()
|
||||||
go func() {
|
go func() {
|
||||||
remote.Forward(client, 0)
|
remote.Forward(client, 0)
|
||||||
server.RemoteMap[mid] = nil
|
delete(server.RemoteMap, mid)
|
||||||
}()
|
}()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -74,10 +80,7 @@ func (server *UServerProxy) ServeTCP(listenAddr string) error {
|
|||||||
}
|
}
|
||||||
zlog.Infof("listen %s", ln.Addr())
|
zlog.Infof("listen %s", ln.Addr())
|
||||||
defer func(ln net.Listener) {
|
defer func(ln net.Listener) {
|
||||||
err := ln.Close()
|
_ = ln.Close()
|
||||||
if err != nil {
|
|
||||||
zlog.Error("close client error: ", err.Error())
|
|
||||||
}
|
|
||||||
}(ln)
|
}(ln)
|
||||||
go server.MessageLoop()
|
go server.MessageLoop()
|
||||||
for {
|
for {
|
||||||
@ -85,6 +88,6 @@ func (server *UServerProxy) ServeTCP(listenAddr string) error {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
server.NewTcpConnection(NewPacketConnect(conn, "client"))
|
go server.NewTcpConnection(NewPacketConnect(conn, "client", 0))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
27
proxy/type.go
Normal file
27
proxy/type.go
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
package proxy
|
||||||
|
|
||||||
|
import "encoding/binary"
|
||||||
|
|
||||||
|
var (
|
||||||
|
Level = 1
|
||||||
|
packetEndian = binary.LittleEndian
|
||||||
|
RemoteID uint32 = 1
|
||||||
|
sid = RemoteID
|
||||||
|
maxSid uint32 = 1024 * 1024
|
||||||
|
MTU = 65495 //1024 * 64
|
||||||
|
HeaderSize = 16
|
||||||
|
Magic = "anki"
|
||||||
|
InitBuf = func() []byte {
|
||||||
|
buf := make([]byte, HeaderSize)
|
||||||
|
copy(buf[:len(Magic)], Magic)
|
||||||
|
return buf
|
||||||
|
}()
|
||||||
|
)
|
||||||
|
|
||||||
|
func IncID() uint32 {
|
||||||
|
if sid > maxSid {
|
||||||
|
sid = RemoteID
|
||||||
|
}
|
||||||
|
sid++
|
||||||
|
return sid
|
||||||
|
}
|
||||||
@ -29,6 +29,7 @@ func main() {
|
|||||||
func init() {
|
func init() {
|
||||||
_addr := flag.String("addr", ServerAddr, "server addr")
|
_addr := flag.String("addr", ServerAddr, "server addr")
|
||||||
_port := flag.Int("port", ServerPort, "listen port")
|
_port := flag.Int("port", ServerPort, "listen port")
|
||||||
|
_level := flag.Int("level", proxy.Level, "debug level")
|
||||||
|
|
||||||
remoteAddr := flag.String("remote_addr", RemoteAddr, "server addr")
|
remoteAddr := flag.String("remote_addr", RemoteAddr, "server addr")
|
||||||
remotePort := flag.Int("remote_port", RemotePort, "listen port")
|
remotePort := flag.Int("remote_port", RemotePort, "listen port")
|
||||||
@ -38,4 +39,5 @@ func init() {
|
|||||||
|
|
||||||
RemoteAddr = *remoteAddr
|
RemoteAddr = *remoteAddr
|
||||||
RemotePort = *remotePort
|
RemotePort = *remotePort
|
||||||
|
proxy.Level = *_level
|
||||||
}
|
}
|
||||||
|
|||||||
@ -24,7 +24,9 @@ func main() {
|
|||||||
func init() {
|
func init() {
|
||||||
_addr := flag.String("addr", ServerAddr, "server addr")
|
_addr := flag.String("addr", ServerAddr, "server addr")
|
||||||
_port := flag.Int("port", ServerPort, "listen port")
|
_port := flag.Int("port", ServerPort, "listen port")
|
||||||
|
_level := flag.Int("level", proxy.Level, "debug level")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
ServerAddr = *_addr
|
ServerAddr = *_addr
|
||||||
ServerPort = *_port
|
ServerPort = *_port
|
||||||
|
proxy.Level = *_level
|
||||||
}
|
}
|
||||||
|
|||||||
BIN
server.exe
BIN
server.exe
Binary file not shown.
@ -14,7 +14,7 @@ var (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
currentLevel = zap.DebugLevel
|
currentLevel = zap.FatalLevel
|
||||||
cfg = zap.NewDevelopmentConfig()
|
cfg = zap.NewDevelopmentConfig()
|
||||||
cfg.Development = true
|
cfg.Development = true
|
||||||
rebuildLoggerFromCfg()
|
rebuildLoggerFromCfg()
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user