一、传统的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