예제 #1
0
func (si *ServerInfo) channelConn(conn *t.TCPConn) {
	// 收到隧道的连接
	KolonseWeb.DefaultLogs().Info("收到隧道连接 Remote:%v Local:%v",
		conn.RemoteAddr().String(),
		conn.LocalAddr().String())
	si.Cache = []byte("")
}
예제 #2
0
func (si *ServerInfo) serverConn(conn *t.TCPConn) {
	// 收到用户数据的连接
	KolonseWeb.DefaultLogs().Info("收到服务连接 Remote:%v Local:%v",
		conn.RemoteAddr().String(),
		conn.LocalAddr().String())
	who := Who{}
	who.SetConn(conn.Conn)
	si.Parters[conn.RemoteAddr().String()] = who
}
예제 #3
0
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
	}
}
예제 #4
0
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
		}
	}
}