IT Notes

Удаленное управление компьютером по сети: Введение

Одно из самых известных приложений по удаленному управлению компьютером - TeamViewer. Займемся разработкой своего упрощенного аналога подобной клиент-серверной системы на C++ с использованием Qt. В этот раз решим подготовительные задачи по анализу и планированию того, что у нас должно получиться.

Удаленное управление в разрезе

Удаленное управление в стиле TeamViewer можно разбить на две части: серверную и клиентскую. Серверной стороной оказывается та, которой управляют. Клиент же занимается управлением.

Для серверной части основными являются следующие функции:

  1. Захват экрана и событий мыши;
  2. Трансляция по сети видео-потока для графического отображения событий, происходящих на экране;
  3. Воспроизведение полученных от удаленного клиента действий по перемещению/щелчкам мыши и нажатию клавиш клавиатуры.

Клиентской части характерны такие функции:

  1. Прием и воспроизведение видео-потока от удаленного источника (сервера) с визуальным представлением происходящего на экране;
  2. Передача на удаленный сервер событий мыши и клавиатуры по сети.

Схематично это можно представить следующим образом:

remote-control-client-server-thumbnail

Какие модули нам понадобятся

Нам известен необходимый функционал. Распределим его по логическим модулям, которые нам потребуется разработать:

  1. InputRecorder - модуль записи видео-потока экрана, событий мыши и клавиатуры. Он нам понадобится как на клиентской, так и на серверной стороне;
  2. InputPlayer - модуль воспроизведения событий мыши и клавиатуры. Нужен на серверной стороне;
  3. RemoteControlServer - сервер удаленного управления;
  4. RemoteControlClient - клиент удаленного управления.

Возможно, нам понадобятся и другие вспомогательные библиотеки, но эта архитектура уже способна удовлетворить ключевые потребности.

Для реализации клиент-серверного взаимодействия я планирую использовать библиотеку LibQxt. Она достаточно проста в использовании. А от сетевой части кроме примитивной передачи сообщений в Qt-приложении нам ничего и не требуется. Поэтому идем на компромисс, и жертвуем переносимостью в пользу более простой реализации.

Выводы

Мы готовы начать разработку. Но хочу предупредить, что, полноценный TeamViewer у нас все же не получится. Мы заведомо игнорируем многие важные вопросы. Например, безопасность, чтобы не усложнять реализацию шифрованием. Так же на практике могут возникнуть проблемы из области оптимизации передачи данных по сети (в первую очередь для видео-потока). Все это не входит в наши цели, поэтому мы закрываем глаза на подобные сложности. Но даже то, что остается, уже можно считать полноценным приложением, при разработке которого мы решим много интересных задач.

Тема следующей части - модуль InputRecorder

Похожие публикации

Комментарии

Интересно как ты будешь создавать inputRecorder и как в этом поможет Qt.

Еще интересно каким образом ты будешь кодировать видео, передаваемое по сети.

Я просто один раз начинал решать похожую задачу и бросил.

Anonymous:

Интересно как ты будешь создавать inputRecorder и как в этом поможет Qt.

Согласен, что Qt может не все. Но я не отбрасывал возможность перехода на низкоуровневый API конкретной платформы. Для этого понадобится не так много кода и всего пара ifdef-ов.

Anonymous:

Еще интересно каким образом ты будешь кодировать видео, передаваемое по сети.

Конечно, "правильным" решением в этом случае является потоковое кодирование видео с помощью того же FFMpeg. Но в статье я уже сделал допущение, что мы обойдемся максимально простой реализацией. А для локальной сети вполне хватит кодирования в Jpeg.

Пример представляет собой очень упрощенный вариант для разбора основных принципов работы программ по типу TeamViewer, а сама статья пишется по просьбам трудящихся.

Здравсвуйте. Как Ты решишь вопрос с IP-адресом. Я имею ввиду если у одной из сторон отсутствует "белая" IP-адреса.

owl:

Здравсвуйте. Как Ты решишь вопрос с IP-адресом. Я имею ввиду если у одной из сторон отсутствует "белая" IP-адреса.

Здравствуйте. Пример предназначается исключительно для работы в рамках локальной сети. Управление компьютером по внешней сети заведомо плохая идея из-за полного отсутствия шифрования. С другой стороны, этот вопрос можно решить чисто административными способами через VPN или виртуальные локальные сети. Сам TeamViewer работает через свой сервер, который, кстати, вчера (1 июня 2016 г) был взломан (по непроверенной информации) и недоступен (по факту).

А мы потом приложение будет работать в режимах 1) Клиент на Windows и Сервер на Windows

2) Клиент на Windows и Сервер на Linux

3) Клиент на Linux и Сервер на Windows

4) Клиент на Linux и Сервер на Linux

примерно так будет работать ?

Anonymous:

А мы потом приложение будет работать в режимах 1) Клиент на Windows и Сервер на Windows

2) Клиент на Windows и Сервер на Linux

3) Клиент на Linux и Сервер на Windows

4) Клиент на Linux и Сервер на Linux

примерно так будет работать ?

Да. Именно так. В любых комбинациях. Теоретически можно и MacOS сюда без особых проблем подключить, но у меня нет возможности отлаживаться на нем.

А когда продолжение ?

На этой неделе будет ?

у меня как рас курсовая по этой теме ?

Тарас:

А когда продолжение ?

На этой неделе будет ?

у меня как рас курсовая по этой теме ?

Здравствуйте. Сегодня вечером выходит вторая часть.