public static LoginWithTokenEx Decode(string hex) { var auth = new LoginWithTokenEx(); int tokensize = (int.Parse(hex.Substring(0, 4).FromHex().Reverse().ToArray().ToHex(), System.Globalization.NumberStyles.HexNumber)) * 2; auth.Token = hex.Substring(4, tokensize); var data = new RVConnectionData(); int surlsize = (int.Parse(hex.Substring(4 + tokensize, 4).FromHex().Reverse().ToArray().ToHex(), System.Globalization.NumberStyles.HexNumber)) * 2; data.StationUrl = hex.Substring(8 + tokensize, surlsize); int spurlsize = (int.Parse(hex.Substring(surlsize + 8 + tokensize, 8).FromHex().Reverse().ToArray().ToHex(), System.Globalization.NumberStyles.HexNumber)) * 2; if (spurlsize != 0) { data.SpecialProtocols = hex.Substring(surlsize + 16 + tokensize, spurlsize); } int surlsize2 = (int.Parse(hex.Substring(16 + surlsize + tokensize + spurlsize, 4).FromHex().Reverse().ToArray().ToHex(), System.Globalization.NumberStyles.HexNumber)) * 2; data.StationUrl2 = hex.Substring(20 + surlsize + tokensize + spurlsize, surlsize2); auth.RVConnectionData = data; int logindatalength = (int.Parse(hex.Substring(20 + surlsize + tokensize + spurlsize + surlsize2, 4).FromHex().Reverse().ToArray().ToHex(), System.Globalization.NumberStyles.HexNumber)) * 2; auth.LoginData = hex.Substring(24 + surlsize + tokensize + spurlsize + surlsize2, logindatalength); return(auth); }
private void Handle(byte[] data, IPEndPoint endpoint) { var hex = data.ToHex(); Console.WriteLine("Received: " + hex); if (hex.Equals("3f3120000000000000000000000034322000")) { //var packet = PRUdpPacket.Decode(data); var resp = "313f08000000000000000f8744db6a1b1887"; //var packet1 = PRUdpPacket.Decode(resp.FromHex()); Send(resp.FromHex(), endpoint); } else { var packet = PRUdpPacket.Decode(data); if (packet.Type == PacketTypes.PING) { //todo, ping handling code } else if (packet.Type == PacketTypes.CONNECT) { var response = new PRUdpPacket() { Flags = new PacketFlags[] { PacketFlags.FLAG_ACK }, Type = PacketTypes.CONNECT, SessionId = packet.SessionId, Signature = packet.Signature, ConnectionSignature = packet.ConnectionSignature }; var p = response.Encode(); Console.WriteLine("Sent: " + p.ToHex()); Send(p, endpoint); } else if (packet.Type == PacketTypes.DATA) { var rvconndata = new RVConnectionData() { StationUrl = "prudps:/127.0.0.1:10264" }; var rmc = new RMCPayload() { CallId = packet.RMCPayload.CallId, MethodId = packet.RMCPayload.MethodId, ProtocolId = packet.RMCPayload.ProtocolId, Payload = rvconndata.Encode() }; var response = new PRUdpPacket() { Flags = new PacketFlags[] { PacketFlags.FLAG_ACK, PacketFlags.FLAG_NEED_ACK }, Type = PacketTypes.DATA, SessionId = packet.SessionId, Signature = packet.Signature, Payload = rmc.Encode(), ConnectionSignature = packet.ConnectionSignature }; var p = response.Encode().ToHex(); Console.WriteLine("Sent: " + p); Send(p.FromHex(), endpoint); } else { Console.WriteLine("Unknown packet: " + hex); } } }