From 45d94b4406fd044b5023f9538edebe0b8d522842 Mon Sep 17 00:00:00 2001 From: unknown Date: Mon, 14 Oct 2019 18:54:25 +0800 Subject: [PATCH] 10/14 --- core/struct.go | 1 + core/utils.go | 43 ++++++++++++++++++++++- server/common/common_inet_proxy_handle.go | 16 +++++++-- 3 files changed, 57 insertions(+), 3 deletions(-) diff --git a/core/struct.go b/core/struct.go index b06b9eb..f332d6f 100644 --- a/core/struct.go +++ b/core/struct.go @@ -28,6 +28,7 @@ var ( CLIENT_CONNECTION_NOT_EXIST = errors.New("the client connection is not exist") BRIDGE_NOT_EXIST = errors.New("the client connection is not exist") REQUEST_EOF = errors.New("the request has finished") + CLIENT_ID_NOT_EXIST = errors.New("the request has finished") ) // Plugin interface, all plugins must implement those functions. diff --git a/core/utils.go b/core/utils.go index 23e7d01..c3b6865 100644 --- a/core/utils.go +++ b/core/utils.go @@ -1,6 +1,12 @@ package core -import "io" +import ( + "bytes" + "encoding/binary" + "encoding/json" + "io" + "net" +) func CopyBuffer(dst io.Writer, src io.Reader) (written int64, err error) { buf := CopyBuff.Get() @@ -28,3 +34,38 @@ func CopyBuffer(dst io.Writer, src io.Reader) (written int64, err error) { } return written, err } + +func SendInfo(conn net.Conn, t interface{}) (int, error) { + /* + The task info is formed as follows: + +----+-----+---------+ + |type| len | content | + +----+---------------+ + | 4 | 4 | ... | + +----+---------------+ + */ + raw := bytes.NewBuffer([]byte{}) + b, err := json.Marshal(t) + if err != nil { + return 0, err + } + lenBytes, err := GetLenBytes(b) + if err != nil { + return 0, err + } + binary.Write(raw, binary.LittleEndian, lenBytes) + return conn.Write(raw.Bytes()) +} + +// get the assembled amount data(len 4 and content) +func GetLenBytes(buf []byte) (b []byte, err error) { + raw := bytes.NewBuffer([]byte{}) + if err = binary.Write(raw, binary.LittleEndian, int32(len(buf))); err != nil { + return + } + if err = binary.Write(raw, binary.LittleEndian, buf); err != nil { + return + } + b = raw.Bytes() + return +} diff --git a/server/common/common_inet_proxy_handle.go b/server/common/common_inet_proxy_handle.go index c9fdcc8..0632102 100644 --- a/server/common/common_inet_proxy_handle.go +++ b/server/common/common_inet_proxy_handle.go @@ -35,10 +35,22 @@ func (proxy *Proxy) Run(ctx context.Context, config map[string]string) error { return core.BRIDGE_NOT_EXIST } clientCtxConn := ctx.Value(core.CLIENT_CONNECTION) + if clientCtxConn == nil { + return core.CLIENT_CONNECTION_NOT_EXIST + } + + clientId := ctx.Value(core.CLIENT_ID) + if clientId == nil { + return core.CLIENT_ID_NOT_EXIST + } brg := bg.(*bridge.Bridge) - brg.GetConnByClientId() - go core.CopyBuffer() + severConn, err := brg.GetConnByClientId(clientId.(int)) + if err != nil { + return err + } + go core.CopyBuffer(severConn, clientCtxConn.(net.Conn)) + core.CopyBuffer(clientCtxConn.(net.Conn), severConn) return nil }