コード例 #1
0
ファイル: TCPServer.go プロジェクト: kolonse/TCPProxy
func (si *ServerInfo) serverRecv(conn *t.TCPConn, buff []byte, err error) {
	// 收到用户数据
	if err != nil {
		pp := kdp.NewKDP()
		pp.Add("Method", "Close").
			Add("RemoteAddr", conn.RemoteAddr().String()).
			Stringify()
		// 将数据发送出去
		_, err := si.ChannelConn.conn.Write(pp.GetBuff())
		if err != nil {
			KolonseWeb.DefaultLogs().Error("服务连接 Addr r_%v|l_%v Error:%v",
				conn.RemoteAddr(),
				conn.LocalAddr(),
				err.Error())
		}
		delete(si.Parters, conn.RemoteAddr().String())
		return
	}
	KolonseWeb.DefaultLogs().Info("服务连接 Addr r_%v|l_%v 收到数据,size:%v",
		conn.RemoteAddr(),
		conn.LocalAddr(),
		len(buff))
	pp := kdp.NewKDP()
	pp.Add("Method", "REQ").
		Add("RemoteAddr", conn.RemoteAddr().String()).
		StringifyBody(buff).
		Stringify()
	fmt.Println("SEND:\n" + pp.HeaderString() + "\n")
	// 将数据发送出去
	if si.ChannelConn.conn == nil {
		KolonseWeb.DefaultLogs().Error("服务连接 Addr r_%v|l_%v Error:%v",
			conn.RemoteAddr(),
			conn.LocalAddr(),
			"隧道连接不存在")
		conn.Close()
		return
	}
	_, err = si.ChannelConn.conn.Write(pp.GetBuff())
	if err != nil {
		KolonseWeb.DefaultLogs().Error("服务连接 Addr r_%v|l_%v Error:%v",
			conn.RemoteAddr(),
			conn.LocalAddr(),
			err.Error())
		return
	}
}
コード例 #2
0
ファイル: RTCPProxyClient.go プロジェクト: kolonse/TCPProxy
func ConnRun(cp *ConnPair) {
	buff := make([]byte, 10000)
	for {
		n, err := cp.dstConn.Read(buff)
		if err != nil {
			fmt.Println(err.Error())
			// 需要向隧道服务发送 服务连接已经关闭的消息
			pp := kdp.NewKDP()
			pp.Add("Method", "Close").
				Add("RemoteAddr", cp.remoteAddr).
				Stringify()
			fmt.Println("向代理服务发送:\n" + pp.HeaderString())
			cp.proxyConn.Write(pp.GetBuff())
			break
		}
		pp := kdp.NewKDP()
		pp.Add("Method", "RES").
			Add("RemoteAddr", cp.remoteAddr).
			StringifyBody(buff[:n]).
			Stringify()
		fmt.Println("向代理服务发送:\n" + pp.HeaderString())
		cp.proxyConn.Write(pp.GetBuff())
	}
}
コード例 #3
0
ファイル: TCPServer.go プロジェクト: kolonse/TCPProxy
func (si *ServerInfo) channelRecv(conn *t.TCPConn, buff []byte, err error) {
	if err != nil {
		// 关闭所有的服务连接
		for _, value := range si.Parters {
			value.conn.Close()
		}
		// 关闭当前的监听连接
		si.Channel.Stop()
		si.Server.Stop()
		//conn.Close()
		KolonseWeb.DefaultLogs().Error("隧道连接 Addr r_%v|l_%v Error:%v", conn.RemoteAddr(), conn.LocalAddr(), err.Error())
		return
	}
	KolonseWeb.DefaultLogs().Info("Addr r_%v|l_%v 收到隧道数据,长度:%v", conn.RemoteAddr(), conn.LocalAddr(), len(buff))
	si.Cache = append(si.Cache, buff...)
	for {
		pp := kdp.NewKDP()
		Err := pp.Parse(si.Cache).GetError()
		if Err.GetCode() == kdp.KDP_PROTO_ERROR_LENGTH {
			KolonseWeb.DefaultLogs().Warn("Addr r_%v|l_%v Warn:%v", conn.RemoteAddr(), conn.LocalAddr(), Err.Error())
			return
		} else if Err.GetCode() != kdp.KDP_PROTO_SUCCESS {
			KolonseWeb.DefaultLogs().Error("Addr r_%v|l_%v Buff:%v Error:%v", conn.RemoteAddr(), conn.LocalAddr(), string(buff), Err.Error())
			conn.Close()
			return
		}
		switch method, _ := pp.Get("Method"); method { // 处理协议
		case "CONN":
			si.ProcessProtoConn(conn.Conn, pp)
		case "RES":
			si.ProcessProtoRes(conn.Conn, pp)
		case "Close":
			si.ProcessProtoClose(conn.Conn, pp)
		}

		si.Cache = si.Cache[pp.GetProtoLen():]
		if len(si.Cache) == 0 {
			break
		}
	}
}
コード例 #4
0
ファイル: RTCPProxyClient.go プロジェクト: kolonse/TCPProxy
func ServerStart() {
	// 连接服务端
	ip := *Server
	index := strings.Index(ip, ":")
	ip = ip[:index]
	serverAddr := fmt.Sprintf("%v:%v", ip, *UsePort+1)
	fmt.Println("CONN ", serverAddr)
	conn, err := net.Dial("tcp", serverAddr)
	if err != nil { // 连接不上服务就直接退出
		fmt.Println(err.Error())
		return
	}
	// 发送连接数据包
	connInfo := make(map[string]string)
	connInfo["name"] = *ProxyName
	body, _ := json.Marshal(connInfo)
	pp := kdp.NewKDP()
	pp.Add("Method", "CONN").
		StringifyBody(body).
		Stringify()
	fmt.Println(string(pp.GetBuff()))
	_, err = conn.Write(pp.GetBuff())
	if err != nil { // 如果出现连接失败 那么直接退出
		conn.Close()
		fmt.Println(err.Error())
		return
	}

	//bExit := make(chan bool, 1)
	buff := make([]byte, 10000)
	var cache []byte
	for {
		n, err := conn.Read(buff)
		if err != nil { //连接出现错误 关闭连接退出
			fmt.Println(err.Error())
			conn.Close()
			//bExit <- false
			break
		}
		cache = append(cache, buff[:n]...)
		for {
			pp := kdp.NewKDP()
			Err := pp.Parse(cache).GetError() //.GetCode()
			if Err.GetCode() == kdp.KDP_PROTO_ERROR_LENGTH {
				break
			} else if Err.GetCode() != kdp.KDP_PROTO_SUCCESS {
				fmt.Println("Parse Error:", Err.Error())
				conn.Close()
				return
			}
			cache = cache[pp.GetProtoLen():]
			fmt.Println("收到请求:\n" + pp.HeaderString())
			switch method, _ := pp.Get("Method"); method {
			case "REQ":
				Req(conn, pp)
			case "Close":
				Close(conn, pp)
			}
			if len(cache) == 0 {
				break
			}
		}
	}
	//<-bExit
}