예제 #1
0
        /// <summary>
        /// Метод обработки конкретного клиента в отдельном потоке.
        /// </summary>
        public void Process()
        {
            NetworkStream networkStream = null; // Базовый поток данных для доступа к сети.
            Task          task          = null; // Отправляемое задание.

            try
            {
                networkStream = _client.GetStream();

                // Получаем информацию о подключённом агенте.
                string           agentInfoStr = GetStrFromStream(networkStream);
                AgentInformation agentInfo    = AgentInformation.Deserealize(agentInfoStr);

                // ???????
                long taskSize = agentInfo.CoresCount * agentInfo.PasswordPerSecond * 5;

                while (_taskManager.GetTask(taskSize, ref task))
                {
                    // Отправляем задание агенту.
                    byte[] data = Encoding.Unicode.GetBytes(task.Serealize());
                    networkStream.Write(data, 0, data.Length);

                    // Получаем результат работы агента.
                    string password = GetStrFromStream(networkStream);

                    // Обрабатываем результат работы агента.
                    if (password != "----------")
                    {
                        _taskManager.PasswordFound(password);
                    }
                }
            }
            catch (Exception)
            {
                // Отправляем диспетчеру задач задание, во время
                // выполнения которого агент завершил свою работу.
                _taskManager.PushTask(task);
            }
            finally
            {
                if (networkStream != null)
                {
                    networkStream.Close();
                }

                if (_client != null)
                {
                    _client.Close();
                }
            }
        }