private void SendAuth() { CMsgRemoteClientAuth authResp = new CMsgRemoteClientAuth() { ClientId = this.clientId, InstanceId = this.instanceId, Status = this.myStatus }; conn.SendPacket(EMsg.RemoteClientAuth, authResp.ToByteArray()); }
private void IncomingMessageProcessing() { IncomingMessageProcessingThreadAlive = true; byte[] bytes = new byte[BufferSize]; while (IncomingMessageProcessingThreadAlive) { try { if (TLSStream.CanRead) { int BytesRead = TLSStream.Read(bytes, 0, BufferSize); if (BytesRead > 0) { int offset = 0; int Length = BitConverter.ToInt32(bytes, offset); offset += 4; String Magic = Encoding.UTF8.GetString(bytes.Skip(offset).Take(4).ToArray()); offset += 4; int Emesg = BitConverter.ToInt32(bytes, offset); offset += 4; int Empty = BitConverter.ToInt32(bytes, offset); offset += 4; using (var stream = new MemoryStream(bytes.Skip(offset).Take(Length - 8).ToArray())) { MsgRemoteClient MessageType = (MsgRemoteClient)(Emesg & 0x7fffffff); #if DEBUG Utils.ColoredConsoleWrite(ConsoleColor.Magenta, "<<" + MessageType + Environment.NewLine); #endif switch (MessageType) { case MsgRemoteClient.CMsgRemoteClientAppStatus: CMsgRemoteClientAppStatus CMsgRemoteClientAppStatus; CMsgRemoteClientAppStatus = Serializer.Deserialize <CMsgRemoteClientAppStatus>(stream); #if DEBUG #endif break; case MsgRemoteClient.CMsgRemoteClientAuth: CMsgRemoteClientAuth CMsgRemoteClientAuth; CMsgRemoteClientAuth = Serializer.Deserialize <CMsgRemoteClientAuth>(stream); #if DEBUG Console.Write("Client ID: " + CMsgRemoteClientAuth.client_id.ToString() + Environment.NewLine + "Hostname: " + CMsgRemoteClientAuth.status.hostname + Environment.NewLine + "OS Type: " + (EOSType)CMsgRemoteClientAuth.status.ostype + Environment.NewLine + "64 Bit: " + CMsgRemoteClientAuth.status.is64bit + Environment.NewLine + "Universe: " + (EUniverse)CMsgRemoteClientAuth.status.euniverse + Environment.NewLine); foreach (CMsgRemoteClientBroadcastStatus.User User in CMsgRemoteClientAuth.status.users) { Console.Write("User ID: " + User.steamid + Environment.NewLine + "Auth Key ID: " + User.auth_key_id + Environment.NewLine); } #endif CMsgRemoteClientAuthResponse AuthResponse = new CMsgRemoteClientAuthResponse(); AuthResponse.eresult = 1; CMsgRemoteClientAuth AuthRequest = new CMsgRemoteClientAuth(); AuthRequest.client_id = ClientID; AuthRequest.status = new CMsgRemoteClientBroadcastStatus(); AuthRequest.status.hostname = Dns.GetHostName(); AuthRequest.status.ostype = (int)Utils.GetOSType(); AuthRequest.status.is64bit = Environment.Is64BitOperatingSystem; AuthRequest.status.euniverse = (int)EUniverse.Public; AuthRequest.status.timestamp = (UInt32)(DateTime.UtcNow.Subtract(new DateTime(1970, 1, 1))).TotalSeconds; // Just copy what the remote client sent // TODO Fix up with real values AuthRequest.status.connect_port = CMsgRemoteClientAuth.status.connect_port; AuthRequest.status.remote_control_port = CMsgRemoteClientAuth.status.remote_control_port; AuthRequest.status.enabled_services = CMsgRemoteClientAuth.status.enabled_services; AuthRequest.status.min_version = CMsgRemoteClientAuth.status.min_version; AuthRequest.status.version = CMsgRemoteClientAuth.status.version; foreach (CMsgRemoteClientBroadcastStatus.User User in CMsgRemoteClientAuth.status.users) { AuthRequest.status.users.Add(User); } AddOutgoingMessageToQueue(AuthResponse); // Accept incomming auth request AddOutgoingMessageToQueue(AuthRequest); // Send auth request break; case MsgRemoteClient.CMsgRemoteClientAuthResponse: CMsgRemoteClientAuthResponse CMsgRemoteClientAuthResponse; CMsgRemoteClientAuthResponse = Serializer.Deserialize <CMsgRemoteClientAuthResponse>(stream); if (CMsgRemoteClientAuthResponse.eresult == 1) { PingingThread.Start(); //We're connected so start the pinging thread ConnectionResponseHandler(true); } else { ConnectionResponseHandler(false); } break; case MsgRemoteClient.CMsgRemoteClientPing: CMsgRemoteClientPing CMsgRemoteClientPing; CMsgRemoteClientPing = Serializer.Deserialize <CMsgRemoteClientPing>(stream); AddOutgoingMessageToQueue(new CMsgRemoteClientPingResponse()); break; case MsgRemoteClient.CMsgRemoteClientPingResponse: CMsgRemoteClientPingResponse CMsgRemoteClientPingResponse; CMsgRemoteClientPingResponse = Serializer.Deserialize <CMsgRemoteClientPingResponse>(stream); break; case MsgRemoteClient.CMsgRemoteClientStartStream: CMsgRemoteClientStartStream CMsgRemoteClientStartStream; CMsgRemoteClientStartStream = Serializer.Deserialize <CMsgRemoteClientStartStream>(stream); break; case MsgRemoteClient.CMsgRemoteClientStartStreamResponse: CMsgRemoteClientStartStreamResponse CMsgRemoteClientStartStreamResponse; CMsgRemoteClientStartStreamResponse = Serializer.Deserialize <CMsgRemoteClientStartStreamResponse>(stream); #if DEBUG Console.Write("Launch Result: " + CMsgRemoteClientStartStreamResponse.e_launch_result.ToString() + Environment.NewLine + "Auth Token: " + Utils.ByteArrayToString(CMsgRemoteClientStartStreamResponse.auth_token) + Environment.NewLine + "Stream Port: " + CMsgRemoteClientStartStreamResponse.stream_port + Environment.NewLine); #endif if (CMsgRemoteClientStartStreamResponse.e_launch_result == 1) //Success, hand off stream control information { StreamStartedResponseHandler(IPAddress, (UInt16)CMsgRemoteClientStartStreamResponse.stream_port, CMsgRemoteClientStartStreamResponse.auth_token); } else { throw new Exception("Failed to start stream EResult: " + CMsgRemoteClientStartStreamResponse.e_launch_result); } break; default: ExceptionHandler(new Exception("Unknown message type: " + (Emesg & 0x7fffffff))); break; } } } } } catch (Exception e) { ExceptionHandler(e); } } }
private void OnPacketReceived(SteamRemoteTransport.Packet packet) { switch (packet.type) { case EMsg.RemoteClientAuth: CMsgRemoteClientAuth auth = CMsgRemoteClientAuth.Parser.ParseFrom(packet.payload); Console.WriteLine(auth); if (IsClient) { SendAuth(); } else { conn.SendPacket(EMsg.RemoteClientAuthResponse, new CMsgRemoteClientAuthResponse() { Eresult = (int)EResult.OK }.ToByteArray()); } break; case EMsg.RemoteClientAuthResponse: CMsgRemoteClientAuthResponse authAck = CMsgRemoteClientAuthResponse.Parser.ParseFrom(packet.payload); Console.WriteLine(authAck); conn.SendPacket(EMsg.RemoteClientAuthResponse, new CMsgRemoteClientAuthResponse() { Eresult = (int)EResult.OK }.ToByteArray()); if (IsServer) { CMsgRemoteClientAppStatus appStatusUpdate = new CMsgRemoteClientAppStatus(); appStatusUpdate.StatusUpdates.AddRange(MyApps); conn.SendPacket(EMsg.RemoteClientAppStatus, appStatusUpdate.ToByteArray()); } break; case EMsg.RemoteClientAppStatus: CMsgRemoteClientAppStatus appStatus = CMsgRemoteClientAppStatus.Parser.ParseFrom(packet.payload); Console.WriteLine(appStatus); if (IsClient) { CMsgRemoteClientAppStatus appStatusUpdate = new CMsgRemoteClientAppStatus(); appStatusUpdate.StatusUpdates.AddRange(MyApps); conn.SendPacket(EMsg.RemoteClientAppStatus, appStatusUpdate.ToByteArray()); } if (!handshakeComplete.Task.IsCompleted) { handshakeComplete.SetResult(null); } break; case EMsg.RemoteClientPing: CMsgRemoteClientPing ping = CMsgRemoteClientPing.Parser.ParseFrom(packet.payload); conn.SendPacket(EMsg.RemoteClientPingResponse, new CMsgRemoteClientPingResponse().ToByteArray()); break; case EMsg.RemoteClientStartStreamResponse: CMsgRemoteClientStartStreamResponse startResponse = CMsgRemoteClientStartStreamResponse.Parser.ParseFrom(packet.payload); Console.WriteLine((EResult)startResponse.ELaunchResult); if ((EResult)startResponse.ELaunchResult == EResult.OK) { Console.WriteLine(startResponse); startStreamTCS.SetResult(startResponse); } break; default: throw new NotImplementedException("Unknown message: " + packet.type); } }