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 } }
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 } } }