本文主要是介绍MirrorLink(四 VNC---libvnc的使用),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
一、传统的VNC连接分为3个阶段(执行过程参照libvnc库中SDLvncviewer.c):
1、握手阶段
具体参数:
2、初始化阶段
具体参数:
3、帧缓冲区更新和事件阶段
具体参数:
二、MirrorLink VNC连接流程
1、握手阶段
这个阶段和传统的VNC连接没有区别
2、初始化阶段
这个阶段在Set Encodings的时候发生了变化,具体流程如下图所示:
注意:在Set Encodings的时候需要加入一个伪编码-523,在这里我们直接修改libvnc库
,MirrorLink需要支持的伪编码有(红色框是目前测试中我们支持的):
Libvnc库具体代码修改如下:
rfbBool
SetFormatAndEncodings(rfbClient* client)
{rfbSetPixelFormatMsg spf;char buf[sz_rfbSetEncodingsMsg + MAX_ENCODINGS * 4];rfbSetEncodingsMsg *se = (rfbSetEncodingsMsg *)buf;uint32_t *encs = (uint32_t *)(&buf[sz_rfbSetEncodingsMsg]);int len = 0;rfbBool requestCompressLevel = FALSE;rfbBool requestQualityLevel = FALSE;rfbBool requestLastRectEncoding = FALSE;rfbClientProtocolExtension* e;if (!SupportsClient2Server(client, rfbSetEncodings)) return TRUE;se->type = rfbSetEncodings;se->pad = 0;se->nEncodings = 0;if (client->appData.encodingsString) {rfbClientLog("%s\n",client->appData.encodingsString);const char *encStr = client->appData.encodingsString;int encStrLen;do {const char *nextEncStr = strchr(encStr, ' ');if (nextEncStr) {encStrLen = nextEncStr - encStr;nextEncStr++;} else {encStrLen = strlen(encStr);}if (strncasecmp(encStr,"raw",encStrLen) == 0) {encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingRaw);} else if (strncasecmp(encStr,"copyrect",encStrLen) == 0) {encs[se->nEncodings++] = rfbClientSwap32IfLE(rfbEncodingC
这篇关于MirrorLink(四 VNC---libvnc的使用)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!