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