Клиент RFB / VNC в C++ (кодировка TRLE)

Я делаю VNC-клиент в VC++ и нужно сделать это для схемы кодирования TRLE. Я использую тугой vnc или реальный vnc в качестве моего сервера, который способен отправлять данные в TRLE (значение кодировки = 15). Поскольку я новичок в RFB и VNC, я сейчас не уверен, как мне прочитать данные, которые я получаю от сервера (я знаю, что сервер отправляет их в типе сообщения 0 с x,y,w,h и encoding_type) и декодировать данные. Есть ли примеры, которые я могу использовать для понимания реализации RFB и методов декодирования? Я нашел в основном примеры кодирования ZRLE, Copyrect или Raw на github, и они не были достаточно понятны в объяснениях.

2 ответа

Сервер отправляет вам данные только в тех кодировках, которые вы (клиент) сообщаете серверу, что можете получить. Поскольку TRLE (15) плохо документирован, вы можете удалить его из сообщения SetEncodings и использовать другие протоколы, которые лучше документированы.

Лучшая (живая) документация для протокола RFB находится здесь:

https://github.com/rfbproto/rfbproto

В настоящее время (сентябрь 2017 г.) отсутствует документация TRLE, например, этот патч от 2009 г. https://www.mail-archive.com/tigervnc-rfbproto@lists.sourceforge.net/msg00235.html

Сообщение SetEncoding от клиента к серверу представляет собой список протоколов, которые клиент понимает, в порядке предпочтительного выбора. Данные RAW всегда возможны, но будут использовать большинство данных.

Исходя из опыта, проще всего реализовать наилучшее сжатие по выгодной цене - это ZRLE (16) с необработанными прямоугольниками, который поддерживается большинством всех серверов, или аналогичный ZLIB (6).

Было бы очень странно, если сервер, к которому вы подключаетесь, поддерживает только TRLE и ничего больше, но в этом случае вы все равно можете запрашивать данные "просто RAW".

Если вы (пере) реализуете колесо как учебное упражнение, вы должны ознакомиться со спецификацией протокола RFB, чтобы понять протокол и методы кодирования / декодирования.

Если вы намереваетесь просто иметь средство просмотра удаленного рабочего стола (возможно, встроенное в ваше приложение), есть более простые способы, чем повторно реализовать протокол. Предполагая, что вы работаете в Windows, вы можете просто запустить средство просмотра как внешний процесс, взять его дескриптор главного окна HWND и сделать его дочерним окном вашего собственного приложения, используя SetParent. Большинство зрителей принимают аргументы командной строки, которые позволят вам передать сервер / порт для подключения.

Существует ряд реализаций, уже доступных (в виде программ просмотра или статических / динамических библиотек) под многими либеральными лицензиями, которые должны быть подходящими. Некоторые из них доступны в исходном виде, и, возможно, они могут иметь некоторые комментарии в коде, которые описывают часть декодирования

Несколько я мог найти:

Гугл привел меня к этому.

Другие вопросы по тегам