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