func (p *ProxyClient) GetLocalConn() (c *conn.Conn, err error) { c, err = conn.ConnectServer(p.LocalIp, p.LocalPort) if err != nil { log.Error("ProxyName [%s], connect to local port error, %v", p.Name, err) } return }
func (p *ProxyClient) GetRemoteConn(addr string, port int64) (c *conn.Conn, err error) { defer func() { if err != nil { c.Close() } }() c, err = conn.ConnectServer(addr, port) if err != nil { log.Error("ProxyName [%s], connect to server [%s:%d] error, %v", p.Name, addr, port, err) return } nowTime := time.Now().Unix() authKey := pcrypto.GetAuthKey(p.Name + p.AuthToken + fmt.Sprintf("%d", nowTime)) req := &msg.ControlReq{ Type: consts.NewWorkConn, ProxyName: p.Name, AuthKey: authKey, Timestamp: nowTime, } buf, _ := json.Marshal(req) err = c.Write(string(buf) + "\n") if err != nil { log.Error("ProxyName [%s], write to server error, %v", p.Name, err) return } err = nil return }
func loginToServer(cli *client.ProxyClient) (c *conn.Conn, err error) { c, err = conn.ConnectServer(client.ServerAddr, client.ServerPort) if err != nil { log.Error("ProxyName [%s], connect to server [%s:%d] error, %v", cli.Name, client.ServerAddr, client.ServerPort, err) return } nowTime := time.Now().Unix() req := &msg.ControlReq{ Type: consts.NewCtlConn, ProxyName: cli.Name, UseEncryption: cli.UseEncryption, UseGzip: cli.UseGzip, PrivilegeMode: cli.PrivilegeMode, ProxyType: cli.Type, Timestamp: nowTime, } if cli.PrivilegeMode { privilegeKey := pcrypto.GetAuthKey(cli.Name + client.PrivilegeToken + fmt.Sprintf("%d", nowTime)) req.RemotePort = cli.RemotePort req.CustomDomains = cli.CustomDomains req.PrivilegeKey = privilegeKey } else { authKey := pcrypto.GetAuthKey(cli.Name + cli.AuthToken + fmt.Sprintf("%d", nowTime)) req.AuthKey = authKey } buf, _ := json.Marshal(req) err = c.Write(string(buf) + "\n") if err != nil { log.Error("ProxyName [%s], write to server error, %v", cli.Name, err) return } res, err := c.ReadLine() if err != nil { log.Error("ProxyName [%s], read from server error, %v", cli.Name, err) return } log.Debug("ProxyName [%s], read [%s]", cli.Name, res) ctlRes := &msg.ControlRes{} if err = json.Unmarshal([]byte(res), &ctlRes); err != nil { log.Error("ProxyName [%s], format server response error, %v", cli.Name, err) return } if ctlRes.Code != 0 { log.Error("ProxyName [%s], start proxy error, %s", cli.Name, ctlRes.Msg) return c, fmt.Errorf("%s", ctlRes.Msg) } log.Debug("ProxyName [%s], connect to server [%s:%d] success!", cli.Name, client.ServerAddr, client.ServerPort) return }
func TestEchoServer(t *testing.T) { c, err := conn.ConnectServer("0.0.0.0", ECHO_PORT) if err != nil { t.Fatalf("connect to echo server error: %v", err) } timer := time.Now().Add(time.Duration(5) * time.Second) c.SetDeadline(timer) c.Write(ECHO_TEST_STR) buff, err := c.ReadLine() if err != nil { t.Fatalf("read from echo server error: %v", err) } if ECHO_TEST_STR != buff { t.Fatalf("content error, send [%s], get [%s]", strings.Trim(ECHO_TEST_STR, "\n"), strings.Trim(buff, "\n")) } }