此线程用来发送更新数据,啥也不说,贴代码: BOOL vncClient::SendUpdate(rfb::SimpleUpdateTracker &update) { //如果没有需要更新的,我们推出此线程 if (update.is_empty() && !m_cursor_update_pending && !m_NewSWUpdateWaiting && !m_cursor_pos_changed) return FALSE; //从触发器获取信息 rfb::UpdateInfo update_info; update.get_update(update_info); update.clear(); //老的更新屏幕大小和新的可能不同,我们首先确保新的更新大小被发送到客户端,此后客户端会请求一次全屏幕更新 if (m_NewSWUpdateWaiting) { m_socket->ClearQueue(); rfbFramebufferUpdateRectHeader hdr; if (m_use_NewSWSize) { hdr.r.x = 0; hdr.r.y = 0; hdr.r.w = Swap16IfLE(NewsizeW); hdr.r.h = Swap16IfLE(NewsizeH); hdr.encoding = Swap32IfLE(rfbEncodingNewFBSize); rfbFramebufferUpdateMsg header; header.nRects = Swap16IfLE(1); SendRFBMsg(rfbFramebufferUpdate, (BYTE *)&header,sz_rfbFramebufferUpdateMsg); m_socket->SendExact((char *)&hdr, sizeof(hdr)); m_NewSWUpdateWaiting=false; m_ScaledScreen = m_encodemgr.m_buffer->GetViewerSize(); m_nScale = m_encodemgr.m_buffer->GetScale(); return TRUE; } } //查看总共有多少区域需要被更新,包含已经编码的拷贝矩形和改变矩形 int updates = 0; int numsubrects = 0; updates += update_info.copied.size(); if (m_encodemgr.IsCacheEnabled()) { if (update_info.cached.size() > 5) { updates++; } else { updates += update_info.cached.size(); //vnclog.Print(LL_INTERR, "cached %d/n", updates); } } rfb::RectVector::const_iterator i; if (updates!= 0xFFFF) { for ( i=update_info.changed.begin(); i != update_info.changed.end(); i++) { // Tight specific (lastrect) numsubrects = m_encodemgr.GetNumCodedRects(*i); // Skip rest rectangles if an encoder will use LastRect extension. if (numsubrects == 0) { updates = 0xFFFF; break; } updates += numsubrects; //vnclog.Print(LL_INTERR, "changed %d/n", updates); } } //如果客户端不支持缓冲,我们就需要发送缓冲像正常的更新一样 if (!m_encodemgr.IsCacheEnabled() && updates!= 0xFFFF) { for (i=update_info.cached.begin(); i != update_info.cache