Клиент 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. Большинство зрителей принимают аргументы командной строки, которые позволят вам передать сервер / порт для подключения.
Существует ряд реализаций, уже доступных (в виде программ просмотра или статических / динамических библиотек) под многими либеральными лицензиями, которые должны быть подходящими. Некоторые из них доступны в исходном виде, и, возможно, они могут иметь некоторые комментарии в коде, которые описывают часть декодирования
Несколько я мог найти:
- TightVNC
- UltraVNC
- Не C++, но все же полезный VNCSharp
- TigerVNC
- libVNCServer / libVNCClient
Гугл привел меня к этому.