私は vc++ で vnc クライアントを作成しており、TRLE エンコーディング スキーム用に作成する必要があります。サーバーとして、TRLE (エンコード値 = 15) でデータを送信できるタイトな vnc または実際の vnc を使用しています。私はRFBとVNCを初めて使用するので、サーバーから取得したデータをどのように読み取ればよいかわかりません(サーバーがx、y、w、hおよびencoding_typeを含むメッセージタイプ0で送信することを認識しています)およびデコードデータ。RFB とデコード技術の実装を理解するために使用できる例はありますか? ほとんどの場合、ZRLE、Copyrect、または Raw エンコーディングの例が github で見つかりましたが、それらの説明は十分に明確ではありませんでした。
2 に答える
学術的な演習として wheel を (再) 実装する場合は、RFB プロトコル仕様を調べて、プロトコルとエンコード/デコード手法を理解する必要があります。
単純にリモート デスクトップ ビューアーを使用する (おそらくアプリケーションに組み込む) ことを意図している場合は、プロトコルを再実装するよりも簡単な方法があります。Windows を実行していると仮定すると、ビューアを外部プロセスとして起動し、そのメイン ウィンドウ ハンドルHWNDを取得して、 SetParentを使用して独自のアプリケーションの子ウィンドウにすることができます。ほとんどのビューアは、接続先のサーバー/ポートを渡すことができるコマンド ライン引数を受け入れます。
適切なはずの多くのリベラルなライセンスの下で、(ビューアまたは静的/動的リンク ライブラリとして) 利用可能な実装が既に多数あります。それらの一部はソース形式で入手でき、デコード部分を説明するコードにコメントが含まれている可能性があります
私が見つけることができたいくつか:
- タイトVNC
- UltraVNC
- C++ ではありませんが、それでも有用なVNCSharp
- タイガーVNC
- libVNCServer/libVNCClient
ちょっとグーグルでこれにたどり着きました。
サーバーは、あなた (クライアント) が受信できることをサーバーに伝えるエンコーディングでデータを送信するだけです。TRLE (15) は十分に文書化されていないため、SetEncodings メッセージから削除して、より適切に文書化されている他のプロトコルを代わりに使用できます。
RFB プロトコルの最良の (生きている) ドキュメントは次のとおりです。
https://github.com/rfbproto/rfbproto
これには現在 (2017 年 9 月)、2009 年のこのパッチなどの TRLE ドキュメントがありません https://www.mail-archive.com/tigervnc-rfbproto@lists.sourceforge.net/msg00235.html
クライアントからサーバーへの SetEncoding メッセージは、クライアントが理解できるプロトコルの優先選択順のリストです。RAW データは常に可能ですが、ほとんどのデータを使用します。
経験から言うと、最高の費用対効果の高い圧縮で実装するのが最も簡単なのは、ほとんどすべてのサーバーでサポートされている生の長方形を使用する ZRLE (16)、または同様の ZLIB (6) です。
接続しているサーバーが TRLE のみをサポートし、他に何もサポートしていない場合は非常に奇妙ですが、その場合でも「RAW のみ」のデータを要求できます。