/// <summary>
        /// Helper method to reduce duplicate LOC
        /// </summary>
        /// <param name="node">The node to send the message to</param>
        /// <param name="command">The command</param>
        /// <param name="payload">The payload that corresponds with the command</param>
        public async Task SendMessageToNode(NetworkNode node, NetworkCommand command, ISerializableComponent payload)
        {
            IPEndPoint endpoint = node.DirectEndpoint ?? node.ListenEndpoint;
            var        msg      = new Message(command.ToString(), payload);
            await node.SendMessageAsync(msg);

            _logger.LogDebug("Sent {0} message to node {1} on port {2}", command.ToString(), endpoint.Address.ToString(), endpoint.Port);
        }
        /// <summary>
        /// Helper method to reduce duplicate LOC
        /// </summary>
        /// <param name="node">The node to receive the message from</param>
        public async Task <Message> ExpectMessageFromNode(NetworkNode node, NetworkCommand expectedCommand)
        {
            var msg = await ListenForNewMessage(node, new TimeSpan(0, 0, NetworkConstants.ExpectMsgTimeoutSeconds));

            if (msg.Command != expectedCommand.ToString())
            {
                throw new ArgumentException("Expected command to be " + expectedCommand.ToString() + " but received " + msg.Command);
            }

            return(msg);
        }
Пример #3
0
    private async void ClientListener()
    {
        byte[] cmdBuffer  = new byte[16];
        byte[] dataBuffer = new byte[64 * 1024];
        int    errors     = 0;

        while (GD.weAreAlive && localListenerAlive)
        {
            try {
                // Enter the listening loop.
                int len = 0;
                while (GD.weAreAlive && localListenerAlive)
                {
                    len += await stream.ReadAsync(cmdBuffer, 0, 16);

                    if (len == 0)
                    {
                        // We did not receive anything, just wait a couple of seconds
                        Thread.Sleep(2000);
                        continue;
                    }
                    if (len < 16)
                    {
                        continue;
                    }

                    NetworkCommand cmd = NetworkManager.GetCommand(cmdBuffer, out int paramLen);
                    len = 0;
                    while (len < paramLen)
                    {
                        len += await stream.ReadAsync(dataBuffer, len, dataBuffer.Length - len);

                        if (len == 0)
                        {
                            // We did not receive anything, just wait a couple of seconds
                            Thread.Sleep(2000);
                            continue;
                        }
                    }

                    GD.DebugLog("Received command: " + cmd.ToString(), GD.LT.Debug);
                    // Process the command
                    switch (cmd)
                    {
                    case NetworkCommand.UpdateGames:
                        OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                            type = ServerMessages.GameListUpdated
                        });
                        break;

                    case NetworkCommand.Pong:
                        OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                            type = ServerMessages.PingAnswer, message = System.Text.Encoding.UTF8.GetString(dataBuffer, 0, paramLen)
                        });
                        break;

                    case NetworkCommand.GamesList:
                        OnServerMessage?.Invoke(this, ReceiveGameList(dataBuffer, paramLen));
                        break;

                    case NetworkCommand.PlayersList:
                        OnServerMessage?.Invoke(this, ReceivePlayersList(dataBuffer, paramLen));
                        break;

                    case NetworkCommand.GameCreated:
                        currentGameID = BitConverter.ToUInt64(dataBuffer, 0);
                        OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                            type = ServerMessages.GameCreated, message = "Game \"" + currentGameID + "\" created and joined"
                        });
                        break;

                    case NetworkCommand.Joined:
                        currentGameID = BitConverter.ToUInt64(dataBuffer, 0);
                        OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                            type = ServerMessages.GameJoined, message = currentGameID.ToString()
                        });
                        break;

                    case NetworkCommand.Left:
                        currentGameID = 0;
                        OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                            type = ServerMessages.GameLeft, message = System.Text.Encoding.UTF8.GetString(dataBuffer, 0, paramLen)
                        });
                        break;

                    case NetworkCommand.GameDeleted:
                        ulong theDeletedGame = BitConverter.ToUInt64(dataBuffer, 0);
                        if (currentGameID == theDeletedGame)
                        {
                            currentGameID = 0;
                        }
                        OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                            type = ServerMessages.GameDeleted, message = theDeletedGame.ToString()
                        });
                        break;

                    case NetworkCommand.GameCanStart:
                        currentGameID = BitConverter.ToUInt64(dataBuffer, 1);
                        OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                            type = ServerMessages.GameCanStart, message = (dataBuffer[0] == 1 ? "Y" : "N") + currentGameID
                        });
                        break;

                    case NetworkCommand.Error:
                        OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                            type = ServerMessages.Error, message = System.Text.Encoding.UTF8.GetString(dataBuffer, 0, paramLen)
                        });
                        break;

                    case NetworkCommand.ReceiveChat:
                        OnChat?.Invoke(this, ReceiveChat(dataBuffer));
                        break;

                    case NetworkCommand.SetPlayersFromGame:
                        OnServerMessage?.Invoke(this, ReceiveGamePlayersList(dataBuffer));
                        break;

                    case NetworkCommand.StartingTheGame:
                        OnServerMessage?.Invoke(this, StartingTheGame(dataBuffer));
                        break;

                    case NetworkCommand.GetRunningGame:
                        DecodeReceivedMultiplayerGame(dataBuffer);
                        break;

                    case NetworkCommand.PlayerDeath:
                        HandlePlayerDeath(dataBuffer);
                        break;

                    case NetworkCommand.GameProgressUpdate:
                        HandleGameProgressUpdate(dataBuffer);
                        break;

                    case NetworkCommand.GameTurn:
                        HandleGameTurnUpdate(dataBuffer);
                        break;

                    default:
                        GD.DebugLog("Unknown command: |" + cmd.ToString() + "|", GD.LT.Log);
                        break;
                    }
                    errors = 0;
                }
            } catch (ThreadAbortException) {
                localListenerAlive = false;
                OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                    message = this.ToString() + " Thread terminated", type = ServerMessages.Info
                });
            } catch (ThreadInterruptedException) {
                localListenerAlive = false;
                OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                    message = this.ToString() + " Thread terminated", type = ServerMessages.Info
                });
            } catch (SocketException e) {
                GD.DebugLog("SocketException when communicating with server: " + e.Message, GD.LT.Warning);
                OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                    message = "SocketException when communicating with server: " + e.Message, type = ServerMessages.Error
                });
                if (!tcpClient.Connected)
                {
                    errors = 10;               // To quit quickly
                }
                errors++;
            } catch (ObjectDisposedException e) {
                if (GD.weAreAlive)
                {
                    GD.DebugLog("Disposed Object Exception when communicating with server: " + e?.Message, GD.LT.Warning);
                    OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                        message = "Disposed Object Exception when communicating with server: " + e?.Message, type = ServerMessages.Error
                    });
                    errors = 10;
                }
            } catch (System.AccessViolationException e) {
                GD.DebugLog("Exception when communicating with server: " + e?.Message, GD.LT.DebugST);
                OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                    message = "Exception when communicating with server: " + e?.Message, type = ServerMessages.Error
                });
                if (!tcpClient.Connected)
                {
                    errors = 10;               // To quit quickly
                }
                errors++;
            }
            if (errors > 10)
            {
                GD.DebugLog(this.ToString() + ": exiting for consecutive errors. Probably the server connection is gone.", GD.LT.Warning);
                OnServerMessage?.Invoke(this, new NetworkManager.ServerMessage {
                    type = ServerMessages.Error, message = "Connection with the server is lost!"
                });
                GD.weAreAlive = false;
            }
        }
    }
Пример #4
0
        public void OnDataRecieved(object[] data)
        {
            NetworkCommand command = (NetworkCommand)data[0];

            Console.WriteLine("NetworkCommand: {0}", command.ToString());

            if (command == NetworkCommand.TaskManager)
            {
                TaskManagerHandler.Handle(data);
            }

            if (command == NetworkCommand.RegistryEdit)
            {
                RegistryEditorHandler.Handle(data);
            }
            if (command == NetworkCommand.FileManager)
            {
                FileManagerHandler.Handle(data);
            }
            if (command == NetworkCommand.Console)
            {
                ConsoleHandler.Handle(data);
            }
            if (command == NetworkCommand.Clipboard)
            {
                ClipboardHandler.Handle(data);
            }
            if (command == NetworkCommand.StartupManager)
            {
                StartupHandler.Handle(data);
            }
            if (command == NetworkCommand.Connections)
            {
                ConnectionsHandler.Handle(data);
            }


            if (command == NetworkCommand.Close)
            {
                Environment.Exit(0);
            }
            if (command == NetworkCommand.Restart)
            {
                MiscHandler.Restart();
            }
            if (command == NetworkCommand.Ping)
            {
                NetworkHost.Send((byte)NetworkCommand.Pong);
            }
            if (command == NetworkCommand.Execute)
            {
                MiscHandler.Execute((string)data[1]);
            }
            if (command == NetworkCommand.ExecuteHidden)
            {
                MiscHandler.ExecuteHidden((string)data[1]);
            }
            if (command == NetworkCommand.DeleteFile)
            {
                MiscHandler.DeleteFile((string)data[1]);
            }
            if (command == NetworkCommand.DownloadAndExecute)
            {
                MiscHandler.DownloadAndExecute((string)data[1], ".exe");
            }
            if (command == NetworkCommand.DownloadFile)
            {
                MiscHandler.DownloadFile((string)data[1], (string)data[2]);
            }
            if (command == NetworkCommand.KillProcess)
            {
                MiscHandler.KillProcess((int)data[1]);
            }
            if (command == NetworkCommand.SuspendProcess)
            {
                MiscHandler.SuspendProcess((int)data[1]);
            }
            if (command == NetworkCommand.ResumeProcess)
            {
                MiscHandler.ResumeProcess((int)data[1]);
            }
            if (command == NetworkCommand.HideWindow)
            {
                MiscHandler.HideWindow((int)data[1]);
            }
        }