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);
                }
            }
        }
Exemplo n.º 2
0
        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);
            }
        }